Как я могу удалить все, кроме перечисленных файлов с помощью команды Find? - PullRequest
0 голосов
/ 22 мая 2009

У меня есть список скрытых файлов в файле "list_files", которые не должны быть удалены в текущем каталоге. Как удалить все, кроме них, командой Find? Я пытался, но это явно не работает:

find . -iname ".*" \! -iname 'list_files'

Ответы [ 3 ]

1 голос
/ 22 мая 2009

Удаление файлов всегда должно выполняться безопасно.

Я предполагаю, что у вас есть дерево каталогов со скрытыми файлами и подмножеством списка этих скрытых файлов, которые вы хотите сохранить. Вы хотите удалить все остальные скрытые файлы.

Давайте начнем со списка скрытых файлов.

find `pwd` -iname ".*" -type f > all-hidden-files.txt

Теперь предположим, что у вас есть какой-то фильтр, который уменьшит список до всех файлов, которые вы хотите сохранить (создавая файлы list_files). Здесь SomeFilter может быть, вы вручную редактируете список файлов, чтобы сохранить те, которые вы не хотите удалять.

SomeFilter all-hidden-files.txt > list_files

Следующая команда определит строки в all-hidden-files.txt, которые отсутствуют в файле list_files, что дает вам файлы, которые можно удалить.

comm -3 all-hidden-files.txt list_files > removable-files.txt

Редактировать: Просто понял, что входные файлы для комм должны быть отсортированы. Так что используйте это как

comm -3 <(sort all-hidden-files.txt | uniq) <(sort list_files | uniq) \
    > removable-files.txt

Вы можете подтвердить, что это работает хорошо для вас, а затем удалить список файлов, сгенерированных с чем-то вроде,

for i in $(<removable-files.txt); do rm $i; done;
1 голос
/ 27 мая 2009

создайте временный каталог в исходном каталоге, переместите все во временный каталог, переместите файлы, которые вы хотите сохранить, обратно в исходное место, а затем рекурсивно удалите временный каталог. Поскольку все перемещения выполняются в одной файловой системе, это должно происходить практически мгновенно с любой приличной файловой системой, и это довольно безопасно.

1 голос
/ 22 мая 2009

Вы можете сделать это, вызвав exec с помощью скрипта bash, примерно так: -

find . -iname ".*" -exec bash -c "fgrep {} /tmp/list_files >/dev/null || rm -i {}" \;

Будьте очень осторожны, как вы строите свой список файлов. Список исключаемых файлов должен совпадать с выводом, созданным командой find, иначе вы удалите все файлы, соответствующие вашему шаблону.

Я включил интерактивную опцию в rm, и вы можете использовать ее для тестирования. Если вы хотите удалить каталоги с помощью этого метода, вам нужно будет изменить параметры rm.

Возможно, вы захотите составить список файлов, используя поиск из той же папки, которую вы будете использовать для запуска поиска, чтобы гарантировать, что исключения будут соблюдены, хотя лучше использовать абсолютный, а не относительный путь, т.е. найти станет

find /some/folder/name -name "some pattern" -exec ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...