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

26

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, zB:

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

Dadurch werden keine Dateien mit Leerzeichen gelöscht.

Ashley
quelle
Komplette Vermutung hier: Funktioniert das find -name "*\ *.txt" | xargs rmfür zwei Wortdateien?
TheWanderer

Antworten:

49

Sie können sagen, findund xargsbeide verwenden Nullterminatoren

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

oder (einfacher) nutzen Sie die eingebaute -deleteAktion vonfind

find . -name "*.txt" -delete

oder (danke @kos)

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

Bei beiden sollte die Systemgrenze eingehalten werden ARG_MAX, ohne dass dies erforderlich ist xargs.

Stahlfahrer
quelle
1
Ich kann es nicht zweimal gutheißen :) da du erwähnt hast, ARG_MAXerwähne ich auch, dass find . -name "*.txt" -exec rm {} \;dies ein "sicherer Schuss" wäre
kos
3
So spricht der Meister: Erinnere dich immer an xargs -0.
Joshua
1
Super wichtiger Punkt: -print0muss die letzte Option sein (oder zumindest danach -name "*.txt"), sonst trifft dies Dateien, die nicht mehr auf*.txt ... beschränkt sind
Kev
1

Ü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

Ibrahim
quelle
Ja, das funktioniert.
Peter Mortensen
0

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 .

joseph_morris
quelle
In dieser Antwort wird für BSD-Systeme -0anstelle von -d(für xargs) erwähnt . Was benutzt Ubuntu? Die akzeptierte Antwort hier verwendet -0. Was ist korrekt?
Peter Mortensen