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:
Ich finde es im Allgemeinen einfacher und weniger verwirrend , die
-exec
Optionfind
zu nutzen. Versuche dies:Alles, was danach
-exec
folgt, ist ein Befehl, der für jedes Ergebnis ausgeführt wird, bis zu dem Befehl;
, der hier maskiert wird, damit er an übergeben wirdfind
. Das{}
wird durch den Dateinamen ersetzt,find
der normalerweise gedruckt wird.Sobald Sie überprüft haben, dass es das tut, was Sie wollen, können Sie das entfernen
-i
.quelle
Wenn Sie GNU haben
find
, können Sie die-delete
Option verwenden:So verwenden
xargs
und vermeiden Sie das Problem mit Leerzeichen in Dateinamen: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.
quelle
Sie können
find
festlegen, dass die Ausgabeliste durch NULL-Werte abgegrenzt werden soll undxargs
die Eingabeliste dasselbe erhalten soll:Stellen Sie außerdem sicher, dass Sie das
*
Kommando mit einem Backslash odervmware-*.log
in einfachen Anführungszeichen schließen, da Ihre Shell andernfalls möglicherweise versucht, es zu erweitern, bevor Sie es an übergebenfind
.quelle
Vergessen Sie nicht die
-delete
Option des Funds. Es entfernt die Datei ohne Fehler mit Sonderzeichen ...quelle