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


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 sich aufgebaut haben.

Ich habe diesen Befehl ausprobiert:

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

Wenn ich jedoch den Befehl ausführe, werden alle Ordner mit Namen in ihren Ordnern verwürgt. Gibt es eine Möglichkeit, den Dateipfad so zu formatieren, dass er von xargs an rm quoted oder ordnungsgemäß maskiert übergeben wird?


17
2017-10-19 18:22


Ursprung


Cross-gepostet: stackoverflow.com/questions/1590297/ ... - Dennis Williamson


Antworten:


Ich finde das im Allgemeinen mit dem -exec Option für find einfacher und weniger verwirrend sein. Versuche dies:

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

Alles danach -exec wird als ein Befehl angesehen, der für jedes Ergebnis ausgeführt wird, bis hin zum ;, die hier entkommt, damit sie weitergegeben wird find. Das {} wird durch den Dateinamen ersetzt, der find würde normalerweise drucken.

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


20
2017-10-19 18:30



Wenn es sich nur um Dateien handelt, die Sie löschen möchten, und nicht um Verzeichnisse, können Sie dem Befehl find den Typ "-type f" hinzufügen. - JamesHannah


Wenn Sie GNU haben find du kannst den ... benutzen -delete Möglichkeit:

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

Benutzen xargs und vermeiden Sie das Problem mit Leerzeichen in Dateinamen:

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

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


18
2017-10-19 19:07



Das ist ordentlich. Ich wusste nichts davon. - Jeff Snider


Du kannst sagen find um die Ausgabeliste mit NULLs und zu begrenzen xargs seine Eingangsliste das gleiche zu erhalten:

$ 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 dem entkommen *, entweder mit einem umgekehrten Schrägstrich, oder indem Sie die vmware-*.log in einfachen Anführungszeichen, andernfalls versucht Ihre Shell, sie zu erweitern, bevor sie an sie übergeben wird find.


8
2017-10-19 18:34





Vergessen Sie nicht die Fundsachen -delete Möglichkeit. Es entfernt die Datei ohne Fehler mit Sonderzeichen ...


6
2017-10-19 19:00