Як видалити всі * .foo у дереві каталогів?
rm -r *.foo
не працює.
Я міг би спробувати цикл, але для цього потрібно рекурсивне розширення:
for x in */*/.../*.foo
do rm $x
done
Що теж неможливо.
Як видалити всі * .foo у дереві каталогів?
rm -r *.foo
не працює.
Я міг би спробувати цикл, але для цього потрібно рекурсивне розширення:
for x in */*/.../*.foo
do rm $x
done
Що теж неможливо.
Відповіді:
Ви можете використовувати find
:
find -name '*.foo' -delete
find . -name
?
man find
: Якщо немає шляху не заданий, використовується поточний каталог .
-exec
дія, яку можна використовувати для цієї мети.
Якщо припустити, що у вас є досить недавня версія bash:
shopt -s globstar
rm -- **/*.foo
Одним з найпростіших рішень було б використовувати команду find з exec
параметром:
find /path/where/to/start/search -type f -name "*.foo" -exec rm {} \;
Тут будуть шукати всі файли з ім'ям * .foo та виконати rm {filename} для кожного.
Якщо у вас багато файлів, використання xargs
команди може бути швидшим:
find /path/where/to/start/search -type f -name "*.foo" | xargs rm
Це знайде всі файли та поставить назви файлів за командою rm до тих пір, поки не буде підтримуватися максимальна довжина команди, яку підтримуватиме ваш distro / shell, тож коли запустіть це, виберіть це:
rm dir1/file1.foo dir1/file2.foo dir1/file3.foo
Як ви можете собі уявити, rm
бінарне потрібно починати набагато менше, що робить це більш швидким варіантом.
| xargs
на -print0 | xargs -0
. За замовчуванням xargs розбиває свої дані на будь-який пробіл, що може призвести до небажаних результатів, якщо в будь-яких іменах файлів чи каталогів є пробіли. Додаткові комутатори змушують find і xmark використовувати нульові байти, які заборонено в іменах, як роздільники.
xargs
або -exec
є більш універсальним.
chown
замість, а неrm
.