-delete
означає, -depth
що не працює -prune
( -depth
починається з листя). У цьому посібнику щодо версії GNU -delete
є попередження ( це розширення FreeBSD, яке також підтримується GNU find
та кількома іншими реалізаціями).
info find --index-search=-delete
Використання дії '-delete' в командному рядку автоматично включається опцію '-depth' (* зверніть увагу на вирази: :). Це може бути дивно, якщо ви раніше лише тестували "-print", тому, як правило, найкраще пам'ятати, щоб явно використовувати "-depth".
info find --index-search=-prune
Оскільки "-delete" означає "-depth", використання "-prune" у поєднанні з "-delete" може призвести до видалення більше файлів, ніж ви планували.
Тут у вас є можливість використовувати rm
замість цього:
find . -name save -prune -o -type f -exec rm -f {} +
(Потенційно небезпечними , якщо є каталог записується іншими там, як можна було б зробити вам видалити файли за межами поточного дерева каталогів, замінивши каталоги з симлінк під час запуску цієї команди).
Більш безпечна альтернатива:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
У цьому немає зазначеної вище проблеми, але це означає запуск одного rm
файлу. --
Необхідно для реалізації FreeBSD, а НЕ GNU один , що імена файлів префікси з ./
.
Як варіант, як пропонує Костас:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(але це все-таки непотрібно спускається в save
каталоги)
Це LC_ALL=C
так *
відповідає будь-якій послідовності байтів (навіть тим, які не утворюють дійсних символів у поточному мові). Зауважте, що це вплине на мову повідомлень про помилки (англійська замість мови користувача).
mv save/ ../some/safer/location
до такої "загальної" команди видалення (... але, звичайно, перед вашою публікацією я би зробив ту саму перевірку і зіткнувся з тією ж проблемою!). Тепер ідіть, знайдіть хорошого "видалення" для файлової системи файли були на ^^