Видаліть усі * .foo в дереві каталогів


3

Як видалити всі * .foo у дереві каталогів?

rm -r *.foo

не працює.

Я міг би спробувати цикл, але для цього потрібно рекурсивне розширення:

for x in */*/.../*.foo
    do rm $x
done

Що теж неможливо.


Як я можу змусити хору працювати рекурсивно? в основному те саме питання, за винятком chownзамість, а не rm.
Ільмарі Каронен

Відповіді:


9

Ви можете використовувати find:

find -name '*.foo' -delete

Це би спрацювало? чи не повинно бути find . -name?
Роб

1
@Rob, man find: Якщо немає шляху не заданий, використовується поточний каталог .
cYrus

Знайти @cYrus дійсно дуже потужно. Їй не вистачає двох дій , які , ймовірно , легко реалізувати: -callso youraction.so і -cfunc Foo.c . Спільний об'єкт повинен лише експортувати функцію void doIt (const char * path). Це було б справді потужно.
user877329

@ user877329, є -execдія, яку можна використовувати для цієї мети.
cYrus

1
@ user877329, я бачу вашу думку, але на моєму досвіді ці інструменти добре допомагають швидко і легко робити справи, але якщо вам потрібно це зробити правильно, вам часто доводиться починати розробку власного інструменту.
cYrus


1

Ви можете спробувати знайти:

find /dir/path -name *.foo -exec rm -f {} \;

3
Не повинно *.fooбути '*.foo'?
Timtech

0

Одним з найпростіших рішень було б використовувати команду 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бінарне потрібно починати набагато менше, що робить це більш швидким варіантом.


2
Я просто пропоную замінити | xargsна -print0 | xargs -0. За замовчуванням xargs розбиває свої дані на будь-який пробіл, що може призвести до небажаних результатів, якщо в будь-яких іменах файлів чи каталогів є пробіли. Додаткові комутатори змушують find і xmark використовувати нульові байти, які заборонено в іменах, як роздільники.
Ільмарі Каронен

Я б просто використав прапор -delete.
Роб

Не всі версії знахідки включають прапор -delete (наприклад, на Solaris <11), тому використовується xargsабо -execє більш універсальним.
mtak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.