Недавно я столкнулся с задачей удаления всех файлов / папок в каталоге, кроме тех, которые соответствуют определенному шаблону. Поэтому я подготовил однострочную Unix-команду для выполнения этой работы. Это должна быть только одна строка? Полагаю, нет, но это определенно круче!
Хотя проблема довольно проста, я был немного удивлен тем, насколько сложным оказалось мое решение. Вот команда, которую я использовал; ПРИМЕЧАНИЕ: это плохое решение, потому что оно не обрабатывает имена файлов, содержащие символы перевода строки (что не имело значения в моей ситуации).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Я не использовал команду "найти", потому что я не хочу копировать в папки, соответствующие PATTERN. Например, рассмотрим следующую файловую структуру:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
При использовании шаблона "foo" необходимо удалить только "first_dir" (и его содержимое, конечно) и «somefile.txt» (не «anotherfile.txt» или «morefiles.log»).
Вопрос, есть ли лучшие (более элегантные и правильные) способы сделать это?
РЕДАКТИРОВАТЬ:
Недавно мне стало известно, что "найти" может быть лучшим вариантом:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Это решение правильно обрабатывает пути, содержащие символы перевода строки.