Нещодавно перед нами стояло завдання видалити всі файли / папки в каталозі, виключаючи ті, що відповідають певній схемі. Тому я підготував однорядну команду unix для виконання роботи. Повинен бути лише один рядок? Я гадаю, ні, але точно так крутіше!
Хоча проблема досить проста, я трохи здивувався тому, наскільки складним було моє рішення. Ось команда, яку я використав; ПРИМІТКА. Це неправильне рішення, оскільки воно не обробляє назви файлів, що містять символи подачі рядків (що в моїй ситуації не мало значення).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Я не використовував команду "find", тому що не хочу повторювати папки, що відповідають 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").
Запитання, чи є кращі (більш елегантні та правильні) способи цього досягти?
EDIT:
Нещодавно мені було звернено увагу, що "знайти" може бути кращим варіантом:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Це рішення правильно обробляє контури, що містять символи подачі рядків.