Wie verwende ich den Befehl find, um Dateien zu löschen, die einem Muster entsprechen?


17

Ich versuche, einen Bash-Befehl zu schreiben, der alle Dateien löscht, die einem bestimmten Muster entsprechen. In diesem Fall sind es alle alten VMware-Protokolldateien, die erstellt wurden.

Ich habe diesen Befehl ausprobiert:

find . -name vmware-*.log | xargs rm

Wenn ich den Befehl ausführe, werden jedoch alle Ordner mit Leerzeichen im Namen blockiert. Gibt es eine Möglichkeit, den Dateipfad so zu formatieren, dass xargs ihn in Anführungszeichen setzt oder ordnungsgemäß maskiert?


Antworten:


20

Ich finde es im Allgemeinen einfacher und weniger verwirrend , die -execOption findzu nutzen. Versuche dies:

find . -name vmware-*.log -exec rm -i {} \;

Alles, was danach -execfolgt, ist ein Befehl, der für jedes Ergebnis ausgeführt wird, bis zu dem Befehl ;, der hier maskiert wird, damit er an übergeben wird find. Das {}wird durch den Dateinamen ersetzt, findder normalerweise gedruckt wird.

Sobald Sie überprüft haben, dass es das tut, was Sie wollen, können Sie das entfernen -i.


1
Wenn Sie nur Dateien und keine Verzeichnisse löschen möchten, können Sie dem Befehl find den Befehl '' -type f '' hinzufügen.
JamesHannah

18

Wenn Sie GNU haben find, können Sie die -deleteOption verwenden:

find . -name "vmware-*.log" -delete

So verwenden xargsund vermeiden Sie das Problem mit Leerzeichen in Dateinamen:

find . -name vmware-*.log -print0 | xargs -0 rm

Ihre Protokolldateien sollten jedoch keine Leerzeichen enthalten. Textverarbeitungsdokumente und MP3-Dateien haben sie wahrscheinlich, aber Sie sollten in der Lage sein, die Namen Ihrer Protokolldateien zu steuern.


Das ist ordentlich. Das wusste ich nicht.
Jeff Snider

8

Sie können findfestlegen, dass die Ausgabeliste durch NULL-Werte abgegrenzt werden soll und xargsdie Eingabeliste dasselbe erhalten soll:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Stellen Sie außerdem sicher, dass Sie das *Kommando mit einem Backslash oder vmware-*.login einfachen Anführungszeichen schließen, da Ihre Shell andernfalls möglicherweise versucht, es zu erweitern, bevor Sie es an übergeben find.


6

Vergessen Sie nicht die -deleteOption des Funds. Es entfernt die Datei ohne Fehler mit Sonderzeichen ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.