Страницы

Поиск по вопросам

пятница, 23 ноября 2018 г.

Удалить все файлы кроме белого списка

Существует некая директория /var/recs содержащая 76763 файлов и 29400 вложенных директорий чей уровень вложенности не превышает -maxdepth 1. Так же, существует список "нужных файлов" (тех, что должны существовать в этой директории) из mysql содержащий 54721 basename (не содержащих путь к файлу) имён. Предо мной встала задача периодически удалять все файлы кроме тех, что есть в списке "нужных файлов". Пока для себя вижу простой путь: искать все файлы с помощью find, брать bash-скриптом basename и банально перебором искать его в списке "нужных файлов": При нахождении - переходить к следующему, в противном случае - удалять. Опционально, удалять пустые директории.
Собственно вопрос: может есть более правильный и/или быстрый способ это делать? Ну, например, привести списки к единому виду, отсортировать, с помощью comm сравнить и удалить лишнее. Может вообще не на bash делать? В общем, буду рад любым идеям :)


Ответ

Создаем файл whitelist.txt с содержимым:
file190 file195 file198
Создаем папку test_folder с файлами, названия некоторых из которых имеются в whitelist.txt :
touch /path/to/test_folder/file{190..200}
И удаляем все, кроме содержащихся в whitelist.txt
grep -vw "$(< whitelist.txt)" < <(find /path/to/test_folder -type f) | xargs rm
Ну или так:
xargs rm < <(grep -vw "$(< whitelist.txt)" < <(find /path/to/test_folder -type f))
Соответственно глубину поиска удаляемых файлов задаем параметром -maxdepth для find
Ну и зачистим пустые директории:
find /path/to/test_folder -type d -exec rmdir -p --ignore-fail-on-non-empty {} \;

Комментариев нет:

Отправить комментарий