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

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

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 lsan weiter . Um solche Probleme zu vermeiden, xargsleiten Sie stattdessen find ... -print0an 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

rmDies kann durch ein Platzhalterzeichen noch weiter verkürzt werden .


Normalerweise lswerden findDateinamen durch Zeilenumbrüche getrennt, aber xargsdie Eingabe wird durch Zeilenumbrüche aufgeteilt.oderRaum, was zu dem angezeigten Verhalten führt.

Es ist möglich, xargsnur 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 -print0wird angewiesen , findDateinamen durch ein Nullbyte zu trennen; dasselbe gilt für xargs -0. (Einige andere Tools haben ähnliche Optionen, wie beispielsweise sort -zoder grep -zZ.)

Die "Kurzversion" verwendet einen einfachen Shell-Platzhalter ("Muster" inbashHandbuch– siehe Abschnitt „Pfadnamenerweiterung“).

verwandte Informationen