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 den Trick machen, aber es tut nicht. Ich versuche, eine Datei mit einer einzelnen Ziffer in Klammern im Dateinamen zu löschen (aus dem Web heruntergeladene Duplikate), aber am Ende geschieht Folgendes:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
weil es den Raum nicht richtig interpretiert. Es sollte "520syllabus2010 (3) .pdf" löschen.
Was ist der richtige Weg, dies zu tun?
Danke, Jeff
#
.#
.(3)
. Es ist am besten, Argumente zu zitieren, damit die Shell sie nicht beeinflusst.Antworten:
Kurzfassung:
Nicht Rohr
ls
zuxargs
. Verwenden Sie stattdessen Pipefind ... -print0
toxargs -0
, um solche Probleme zu vermeiden.... was geschrieben werden kann als:
und:
was weiter auf nur
rm
mit einem Platzhalter gekürzt werden kann .Normalerweise
ls
undfind
trennen Sie Dateinamen mit Zeilenumbrüchen, teilen Siexargs
die Eingabe jedoch durch Zeilenumbrüche oder Leerzeichen auf, was zu dem angezeigten Verhalten führt.Es ist möglich,
xargs
nur nach Zeilenumbruch zu teilen, aber Dateien können auch Zeilenumbrüche in ihren Namen haben. Unter Linux und BSD ist das einzige unzulässige Zeichen das "Null" - oder Null-Byte - daher sollten Sie es in solchen Fällen verwenden.In Beispiel 2 oben wird angegeben,
-print0
dassfind
Dateinamen durch ein Null-Byte getrennt werden sollen. Gleiches gilt fürxargs -0
. (Einige andere Tools bieten ähnliche Optionen, z. B.sort -z
odergrep -zZ
.)Die "Kurzversion" verwendet einen einfachen Shell-Platzhalter ("Muster" im
bash
Handbuch - siehe Abschnitt "Pfadnamenerweiterung").quelle
*" "\\([1-9]\\).*
, nur Dateien mit einem Leerzeichen vor der Paren-Nummer vor dem Zeitraum (a, um fair zu sein) zu löschen.