it-swarm.com.de

Wenn find -name an xargs weitergeleitet wird, werden Dateinamen mit Leerzeichen nicht an den Befehl übergeben

Normalerweise müssten Sie Folgendes ausführen, um Dateien mit Leerzeichen im Dateinamen zu entfernen:

$ rm "file name"

aber wenn ich mehrere Dateien entfernen möchte, z.

$ find . -name "*.txt" | xargs rm

Dadurch werden keine Dateien mit Leerzeichen gelöscht.

26
Ashley

Sie können find und xargs anweisen, beide Nullterminatoren zu verwenden

find . -name "*.txt" -print0 | xargs -0 rm

oder (einfacher) benutze die eingebaute -delete Aktion von find

find . -name "*.txt" -delete

oder (danke @kos)

find . -name "*.txt" -exec rm {} +

in beiden Fällen sollte das Systemlimit ARG_MAX eingehalten werden, ohne dass xargs erforderlich ist.

48
steeldriver

Übrigens, wenn Sie etwas anderes als find verwendet haben, können Sie tr verwenden, um die Zeilenumbrüche durch Null-Bytes zu ersetzen.

Z.B. Die folgende Zeile löscht die 10 zuletzt geänderten Dateien in einem Verzeichnis, auch wenn sie Leerzeichen im Namen haben.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm

1
Ibrahim

Der Befehl xargs verwendet standardmäßig Tabulatoren, Leerzeichen und neue Zeilen als Begrenzer. Mit der Option -d können Sie festlegen, dass nur Zeilenumbrüche ('\ n') verwendet werden sollen:

find . -name "*.txt" | xargs -d '\n' rm

Quellantwort auf SO .

0
joseph_morris