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.


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.


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


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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.