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?

Dan Monego
quelle
Cross-posted: stackoverflow.com/questions/1590297/…
Bis auf weiteres angehalten.

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.

Jeff Snider
quelle
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.

Bis auf weiteres angehalten.
quelle
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.

James Sneeringer
quelle
6

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

Dom
quelle