webentwicklung-frage-antwort-db.com.de

Löschen Sie eine Liste von Dateien mit find und grep

Ich möchte alle Dateien löschen, deren Namen ein bestimmtes Word enthalten, z. "Auto" . Bisher habe ich mir folgendes ausgedacht:

find|grep car

Wie gebe ich die Ausgabe an rm weiter?

29
Magnus
find . -name '*car*' -exec rm -f {} \;

oder übergeben Sie die Ausgabe Ihrer Pipeline an xargs:

find | grep car | xargs rm -f

Beachten Sie, dass dies sehr stumpfe Werkzeuge sind und Sie wahrscheinlich Dateien entfernen, die Sie nicht entfernen wollten. Es werden auch keine Anstrengungen unternommen, um Dateien zu bearbeiten, die Zeichen wie Leerzeichen (einschließlich Zeilenumbrüche) oder führende Bindestriche enthalten. Sei gewarnt. 

74
William Pursell

Um anzuzeigen, was Sie zuerst löschen möchten, da rm -fr ein gefährlicher Befehl ist:

find /path/to/file/ | grep car | xargs ls -lh

Wenn das Ergebnis Ihren Wünschen entspricht, führen Sie den echten Befehl aus, indem Sie den ls -lh entfernen und durch den rm -fr ersetzen.

find /path/to/file/ | grep car | xargs rm -fr
9
Tony-Caffe

Ich benutze gerne

rm -rf $(find . | grep car)

Es macht genau das, was Sie fragen, logisch ausgeführt rm -rf auf dem was grep car ergibt sich aus der Ausgabe von find . ist eine Liste aller rekursiven Dateien und Ordner.

6
ibrokemypie

Dadurch wird eine Datei mit übereinstimmendem Muster (* .xml) gefunden und der Inhalt wird nach übereinstimmender Zeichenfolge durchsucht (exclude = "1"). Diese Datei wird gelöscht, wenn eine Übereinstimmung gefunden wird.

find . -type f -name "*.xml" -exec grep exclude=\"1\" {} \; -exec rm {} \;
2
Neal Garrett

Sie möchten find wirklich mit -print0 und rm mit -- verwenden:

find [dir] [options] -print0 | grep --null-data [pattern] | xargs -0 rm --

Ein konkretes Beispiel (Entfernen aller Dateien unterhalb des aktuellen Verzeichnisses, das den Dateinamen car enthält):

find . -print0 | grep --null-data car | xargs -0 rm --

Warum ist das notwendig:

  • -print0, --null-data und -0 ändern die Behandlung der Eingabe/Ausgabe von geparsten als durch Leerzeichen getrennten Tokens in geparste als durch das \0- Zeichen getrennte Tokens. Dies ermöglicht die Behandlung ungewöhnlicher Dateinamen (siehe man find für Details).
  • rm -- stellt sicher, dass Dateien, die mit einem - beginnen, tatsächlich entfernt werden, anstatt sie als Parameter für rm zu behandeln. Falls es eine Datei mit dem Namen -rf und do find . -print0 | grep --null-data r | xargs -0 rm gibt, wird die Datei -rf möglicherweise nicht entfernt, ändert jedoch das Verhalten von rm in den anderen Dateien.
2
Qw3ry

wann find | grep car | xargs rm -f Ergebnisse bekommen:

/path/to/car  
/path/to/car copy  

einige Dateien, die Leerzeichen enthalten, werden nicht entfernt.

Meine Antwort lautet also:

find | grep car | while read -r line ; do 
  rm -rf "${line}"
done

So könnte die Datei, die Leerzeichen enthält, entfernt werden.

1
amazingthere

Ein bisschen Nekromantie, aber Sie können auch find, grep und xargs verwenden

find . -type f | grep -e "pattern1" -e "pattern2" | xargs rm -rf

^ Suchen wird etwas Aufmerksamkeit erfordern, damit es möglicherweise für Ihre Anforderungen funktioniert, z. B. eine Datei, Mindepth, Maxdepth und jedes Globbing.

1
mcdoomington

Sie können ls und grep verwenden, um Ihre Dateien zu finden, und rm -rf, um die Dateien zu löschen.

rm -rf $(ls | grep car)

Dies ist jedoch keine gute Idee, wenn Sie diesen Befehl verwenden, wenn Verzeichnisse oder Dateien möglicherweise nicht gelöscht werden sollen und Namen mit dem Zeichenmuster vorhanden sind, das Sie mit grep angeben.

0
nsssayom
find start_dir -iname \*car\* -exec rm -v {} \;
0
X Tian