staging.inyokaproject.org

grep | rm ;-)

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 18.04 (Bionic Beaver)
Antworten |

386sx

Anmeldungsdatum:
30. April 2012

Beiträge: Zähle...

Jaaa, so wie im betreff geht das nicht.. aber der geneigte Leser ahnt, was ich vorhabe: Ein Verzeichnis rekursiv nach Dateien mit einem bestimmten Inhalt durchsuchen und diese löschen. Ein Einzeiler mit pipe geht wohl nicht (lasse mich aber gern korrigieren).

Mit

grep -Rl suchwort *.* > rm.list

kriege ich eine Dateiliste mit den Kandidaten zu löschen, aber ich brauche Nachhilfe um den Inhalt an rm zu übergeben. Mit for...do Schleifen hab ich mich zuletzt in batch-Dateien unter DOS beschäftigt.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

386sx schrieb:

Ein Verzeichnis rekursiv nach Dateien mit einem bestimmten Inhalt durchsuchen und diese löschen.

find kann das.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Man könnte die Funde von grep über xargs an rm weiterleiten:

grep -Rl suchwort *.* | xargs rm  

Genauso kann man damit auch Argumente aus Dateien lesen (zumindest solange es keine Zeilenumbrüche in den Dateinamen gibt):

xargs -a rm.list rm 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

seahawk1986 schrieb:

Man könnte die Funde von grep über xargs an rm weiterleiten:

grep -Rl suchwort *.* | xargs rm  

Das funktioniert schlecht, weil die meisten Verzeichnisse keinen Punkt enthalten. Außerdem ist es so nicht sehr robust bei Sonderzeichen. Dann sollte man das zumindest so machen:

grep -RZl suchwort . | xargs -r0 rm  

Man kann das auch elegant mit find -q lösen - insbesondere, wenn man weitere Kriterien für die Dateiauswahl nutzen will (z.B. Name, Größe, Änderungsdatum):

1
2
3
4
5
6
$ echo foo >f1
$ echo bar >f2
$ find -type f -exec fgrep -q fo {} \; -delete -print
./f1
$ ls -1
f2

Der "-print" ist nur zur Kontrolle da. Kann man auch weglassen.

Antworten |