2009-05-21 4 views
0

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

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

ответ

1

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

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

Позволяет начать со списка скрытых файлов.

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

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

SomeFilter all-hidden-files.txt > list_files 

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

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

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

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

Вы можете сделать это путем вызова Exec с Баш скрипт так что-то вроде этого: -

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

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

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

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

find /some/folder/name -name "some pattern" -exec .... 
1

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