Załóżmy, że chcę usunąć wszystkie pliki w folderze, które są większe niż 1 MB.
$ find . -size +1M | xargs -0 rm
Nie spowoduje to usunięcia plików, które mają spacje w swoich nazwach. Chcę, żeby zacytował wszystkie argumenty, do których wysyła rm
. Jeśli find
daje to Some report.docx
powinien on przejść "Some report.docx"
do rm
.
Jak mogę to zrobić?
xargs
. Również, jak sugeruje wiki, nie używajxargs
bez przekazania-print0
dofind
.xargs -d$'\n'
aby ograniczyć ogranicznik tylko do nowych wierszy (a nie spacji; nie przetwarzałoby to specjalnie cudzysłowów itp. - Sprawdziłem w systemie GNU) - odpowiedź podana w stackoverflow.com/a/33528111/94687Odpowiedzi:
Proste użycie:
Jeśli nalegasz na używanie
xargs
irm
przy pomocyfind
, po prostu dodaj-print0
polecenie:Inny sposób:
Od
man find
:źródło
"Some report.docx"
dorm
, chyba że nazwa pliku zawiera cudzysłowy. To, czego chcesz, to przekazanieSome report.docx
niezbawionegorm
. Odpowiedź KasiyA (teraz) pokazuje ogólny sposób, aby to zrobićfind
. [KasiyA: przepraszam za zły ping.]$0
i$1
itd.xargs -0
zamiastxargs -r0
.Opcja
-0
zxargs
pomocą, że wyjście z rury jest interpretowany jako NUL przedmiotów. W takim przypadku musisz również utworzyć dane wejściowe dla potoku za pomocąfind ... -print0
.źródło
Miałem podobny wymóg i ostatecznie użyłem
-I
przełącznika, aby mieć symbol zastępczy i mogłem go zacytować.źródło