Недавно я столкнулся с задачей удаления всех файлов / папок в каталоге, кроме тех, которые соответствуют определенному шаблону. Поэтому я подготовил однострочную команду 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
Это решение правильно обрабатывает пути, содержащие символы перевода строки.