2009-10-19 4 views
11

Ich versuche, einen Bash-Befehl zu schreiben, der alle Dateien mit einem bestimmten Muster löschen wird - in diesem Fall sind es alle alten VMware Log-Dateien, die aufgebaut haben.Shell Scripting: Verwenden von Bash mit Xargs

Ich habe diesen Befehl versucht:

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

Allerdings, wenn ich den Befehl ausführen, Drosseln auf alle Ordner auf die Leerzeichen in ihren Namen haben. Gibt es eine Möglichkeit, den Dateipfad so zu formatieren, dass er von xargs an rm quoted oder ordnungsgemäß maskiert übergeben wird?

+0

Kreuz posted: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

Antwort

24

Versuchen Sie es mit:

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

Dies führt zur Ausgabe eines Null-Zeichen nach jedem Dateinamen finden und erzählt xargs Namen zu brechen basierend auf Null-Zeichen anstelle von Leerzeichen oder anderen Token.

5

Überprüfen Sie die -0 Flagge für xargs; kombiniert mit find 's -print0 sollten Sie eingestellt werden.

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

Verwenden Sie keine xargs. Finden Sie es tun können ohne Hilfe:

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

+3

Es ist immer gut um zu vermeiden, einen zusätzlichen Prozess zu starten, vor allem so etwas, wo du Xargs etwas viel zu lange zur Verfügung stellen könntest. Beachten Sie, dass 'find' sogar eine 'delete'-Aktion hat, die Sie anstelle von' -exec ... 'verwenden können - aber es ist einfacher, diese Art anzupassen. Sie müssen die geschweiften Klammern auch nicht angeben, es sei denn, Sie verwenden eine alte Shell wie tcsh. – Cascabel

+3

Aber dies wird einen 'rm' Prozess für jede Datei einzeln starten, anstatt mehrere Dateinamen an' rm' zu übergeben, wie 'xargs' das tut, also wird es langsamer. – JaakkoK

+5

@jk: Das ist der Grund, warum neuere 'find' Implementierungen' find -exec rm '{}' + 'haben, was Argumente wie" xargs "zusammenfasst. – ephemient

1

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

Verwendung -iname für Mustersuche

0

Um zu vermeiden, Raum Problem in xargs finde ich verwende ein neues Zeilenzeichen als sep Arator mit Option -d:

find . -name vmware-*.log | xargs -d '\n' rm