ls | grep | rm - Wie formatiere ich diesen Befehl?

11

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

Jeff
quelle
1
Ihr Beispieldateiname enthält kein Literal #.
Benjamin Bannier
1
@honk: Er sucht kein Wort #.
Ignacio Vazquez-Abrams
1
Aufgrund der Erweiterung durch die Shell funktioniert dies nicht wie erwartet, wenn der cwd eine Datei mit dem Namen z (3). Es ist am besten, Argumente zu zitieren, damit die Shell sie nicht beeinflusst.
Ignacio Vazquez-Abrams
1
Sie werden von dem Trennerproblem en.wikipedia.org/wiki/Xargs#The_separator_problem
Ole Tange

Antworten:

19

Kurzfassung:

rm *\([1-9]\)*

Nicht Rohr lszu xargs. Verwenden Sie stattdessen Pipe find ... -print0to xargs -0, um solche Probleme zu vermeiden.

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... was geschrieben werden kann als:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

und:

find . -maxdepth 1 -name '*([1-9])*' -delete

was weiter auf nur rmmit einem Platzhalter gekürzt werden kann .


Normalerweise lsund findtrennen Sie Dateinamen mit Zeilenumbrüchen, teilen Sie xargsdie Eingabe jedoch durch Zeilenumbrüche oder Leerzeichen auf, was zu dem angezeigten Verhalten führt.

Es ist möglich, xargsnur 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, -print0dass findDateinamen durch ein Null-Byte getrennt werden sollen. Gleiches gilt für xargs -0. (Einige andere Tools bieten ähnliche Optionen, z. B. sort -zoder grep -zZ.)

Die "Kurzversion" verwendet einen einfachen Shell-Platzhalter ("Muster" im bashHandbuch - siehe Abschnitt "Pfadnamenerweiterung").

user1686
quelle
1
Und um sicher zu gehen, ist es besser *" "\\([1-9]\\).*, nur Dateien mit einem Leerzeichen vor der Paren-Nummer vor dem Zeitraum (a, um fair zu sein) zu löschen.
Ignacio Vazquez-Abrams
Nicht sehr vertraut mit dieser Syntax, aber basierend auf den Upvotes habe ich es ausprobiert und was weißt du ... es hat funktioniert! Vielen Dank!
Jeff
1
+1. -print0 ist wichtig für die korrekte Weiterleitung an xargs.
Chris W. Rea