#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) Либо если файлов мало, то: Делаем хард-линки на нужные файлы в соседнюю пустую директорию. Удаляем все файлы Перемещаем хард-линки из соседней директории.
Комментариев нет:
Отправить комментарий