Ich versuche, eine Reihe von Dateien in einem bestimmten Verzeichnis zu löschen (unter Mac OS X mit Terminal).
ls | grep \([1-9]\) | xargs rm
sollte funktionieren, tut es aber nicht. Ich versuche, alle Dateien zu löschen, deren Dateiname eine einzelne Ziffer in Klammern enthält (aus dem Internet heruntergeladene Duplikate), aber das Ergebnis ist ungefähr wie folgt:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
weil es das Leerzeichen nicht richtig interpretiert. Es sollte "520syllabus2010 (3).pdf" löschen.
Wie geht man das richtig?
Danke, Jeff
Antwort1
Kurzfassung:
rm *\([1-9]\)*
Leiten Sie nicht ls
an weiter . Um solche Probleme zu vermeiden, xargs
leiten Sie stattdessen find ... -print0
an weiter .xargs -0
find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm
... was wie folgt geschrieben werden kann:
find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;
Und:
find . -maxdepth 1 -name '*([1-9])*' -delete
rm
Dies kann durch ein Platzhalterzeichen noch weiter verkürzt werden .
Normalerweise ls
werden find
Dateinamen durch Zeilenumbrüche getrennt, aber xargs
die Eingabe wird durch Zeilenumbrüche aufgeteilt.oderRaum, was zu dem angezeigten Verhalten führt.
Es ist möglich, xargs
nur durch Zeilenumbrüche zu teilen, aber Dateiendürfenhaben auch Zeilenumbrüche in ihren Namen. Tatsächlich unter Linux und BSD, dienur Unzulässiges Zeichenist der"Null"oder Null-Byte– das sollten Sie in solchen Fällen verwenden.
Im obigen Beispiel 2 -print0
wird angewiesen , find
Dateinamen durch ein Nullbyte zu trennen; dasselbe gilt für xargs -0
. (Einige andere Tools haben ähnliche Optionen, wie beispielsweise sort -z
oder grep -zZ
.)
Die "Kurzversion" verwendet einen einfachen Shell-Platzhalter ("Muster" inbash
Handbuch– siehe Abschnitt „Pfadnamenerweiterung“).