В качестве продолжения ответа mouviciel, вы также можете сделать это как цикл for вместо использования xargs. Я часто нахожу xargs громоздким, особенно если мне нужно делать что-то более сложное в каждой итерации.
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm $f; done
Как прокомментировал ряд людей, это потерпит неудачу, если в именах файлов есть пробелы. Вы можете обойти это, временно установив IFS (внутренний разделитель полей) на символ новой строки. Это также не работает, если \[?*в именах файлов есть символы подстановки . Вы можете обойти это, временно отключив подстановочное расширение (globbing).
IFS=$'\n'; set -f
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm "$f"; done
unset IFS; set +f
Если в именах файлов есть переводы строк, это тоже не сработает. Вам лучше с решением на основе XARGS:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -print0 | xargs -0 rm
(Здесь необходимо использовать экранированные скобки, чтобы -print0применить их к обоим orпунктам.)
GNU и * BSD find также имеют -deleteдействие, которое будет выглядеть так:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -delete
rmчто это часть кода OP, но на самом деле это не имеет отношения к заданному вопросу. Я думаю, что было бы безопаснее, если бы ответы были сформулированы с использованием такой безобидной команды, какecho.