grep output an rm übergeben

47

Ich versuche, die grepAusgabe an zu leiten rm, aber es gibt nutzloses Material aus. Ist ein Schalter erforderlich für rm? Oder kann rmdirekt ein regulärer Ausdruck bereitgestellt werden?

ls | grep '^\[Daruchini'| rm

rm: fehlender Operand Weitere Informationen finden Sie in `rm --help '.

CodeBladeRunner
quelle
Fehlermeldungen immer kopieren und einfügen. (Ich habe die eigentliche Fehlermeldung zum Nutzen zukünftiger Leser eingefügt. Dies konnte ich jedoch nur tun, da es in diesem Fall nur eine mögliche Fehlermeldung gibt. In den meisten Fällen ist es wichtig, die genaue Fehlermeldung zu haben, um das Problem zu verstehen Kopieren Sie also immer alle Fehlermeldungen vollständig und fügen Sie sie ein.)
Gilles 'SO- hör auf, böse zu sein'

Antworten:

57

Sie müssen verwenden xargs, um die Standardeingabe in Argumente für zu verwandeln rm.

$ ls | grep '^Dar' | xargs rm

(Achten Sie auf Sonderzeichen in Dateinamen. Bei GNU grep ist dies möglicherweise besser

$ ls | grep -Z '^Dar' | xargs -0 rm

)

Auch wenn die Shell keine regulären Ausdrücke verwendet, ist dies ein einfaches Muster:

$ rm Dar*

(In der Zwischenzeit denke ich, dass ich mehr Schlaf brauche.)

Geekosaurier
quelle
2
Angenommen, der Fragesteller hat keinen Fehler gemacht, als er die Frage gestellt hat, nach der er gesucht hat rm Dar*, nicht rm !(Dar*).
Gilles 'SO- hör auf böse zu sein'
... richtig, ja, ich war im zsh ^Modus fest (ähnlich wie das basg !Ding).
Geekosaurier
1
+1 Tolle Antwort, ich musste | tr "\n" "\0"vor dem xargsBit hinzufügen . Gesehen in diesem Beitrag: stackoverflow.com/questions/20307299/…
Adam Plocher
5

Analysieren Sie nicht die Ausgabe vonls .

Hier ist es sehr einfach, die Shell dazu zu bringen, die gewünschten Dateien zu filtern. Beachten Sie, dass es die Shell ist, die das Muster erweitert Dar*, nicht der rmBefehl. Die von der Shell ausgeführte Mustererweiterung wird als Globbing bezeichnet .

rm Dar*

In komplexeren Fällen schlagen Sie den findBefehl nach.

Gilles 'SO - hör auf böse zu sein'
quelle
3

Wenn Sie die Ausgabe grepvon Zeilenumbrüchen anstelle von Leerzeichen eingrenzen möchten , können Sie dies xargsüber die -dOption festlegen .

$ ls | grep '^Dar' | xargs -d '\n' rm

(wie in dieser Frage beschrieben)

mherzl
quelle
2

Um die Ausgabe als Argument weiterzugeben, verwende ich normalerweise eine while-Schleife, da ich mit xargs nicht vertraut bin.

ls | grep '^Dar' | while read line; do rm "$line";done;
Mitms
quelle
Dies ist die einzige, die in meinem Fall funktioniert hat.
Marbel
0

Der beste Befehl für mich ist:

find ./Daruchini* -exec rm {}\;
Bodale
quelle