Страницы

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

вторник, 24 декабря 2019 г.

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

#linux #администрирование


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

Собственно вопрос: может есть более правильный и/или быстрый способ это делать? Ну,
например, привести списки к единому виду, отсортировать, с помощью comm сравнить и
удалить лишнее. Может вообще не на bash делать? В общем, буду рад любым идеям :)
    


Ответы

Ответ 1



Создаем файл 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 {} \;

Ответ 2



Как вариант: $ shopt -s extglob $ rm -rf !(my_very_important_file) Либо если файлов мало, то: Делаем хард-линки на нужные файлы в соседнюю пустую директорию. Удаляем все файлы Перемещаем хард-линки из соседней директории.

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

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