Jako uzupełnienie odpowiedzi mouviciel, możesz również zrobić to jako pętlę for, zamiast używać xargs. Często uważam, że xargs są uciążliwe, zwłaszcza jeśli w każdej iteracji muszę zrobić coś bardziej skomplikowanego.
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm $f; done
Jak komentowało wiele osób, zakończy się to niepowodzeniem, jeśli w nazwach plików są spacje. Możesz obejść ten problem, tymczasowo ustawiając IFS (wewnętrzny separator pól) na znak nowej linii. To również kończy się niepowodzeniem, jeśli \[?*
w nazwach plików znajdują się symbole wieloznaczne . Możesz to obejść, tymczasowo wyłączając ekspansję wieloznaczną (globbing).
IFS=$'\n'; set -f
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm "$f"; done
unset IFS; set +f
Jeśli w nazwach plików masz znaki nowej linii, to też nie zadziała. Lepiej Ci będzie z rozwiązaniem opartym na Xargs:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -print0 | xargs -0 rm
(Nawiasy ze znakami ucieczki są tutaj wymagane, aby mieć -print0
zastosowanie do obu or
klauzul).
Znajdowanie GNU i * BSD ma również -delete
akcję, która wyglądałaby następująco:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -delete
rm
to część kodu OP, ale tak naprawdę nie ma związku z zadanym pytaniem. Myślę, że byłoby bezpieczniej, gdyby odpowiedzi zostały sformułowane za pomocą nieszkodliwego polecenia, takiego jakecho
.