Befehlszeile: So behandeln Sie Leerzeichen in Dateinamen

2

Ich messe die Gesamtgröße einer Reihe von Dateien, deren Pfade ich in einem Textdokument, files.txt, gespeichert habe. Beispielinhalt von files.txt:

file1.txt
file2.txt
file3.txt

Dieser Shell-Befehl gibt mir die Ausgabe, die ich möchte:

$ du -hc $(cat files.txt)

es sei denn, ich habe einen Dateinamen mit Leerzeichen, zB: file 9.txtDann wird du -hcversucht, den Dateinamen an dem Leerzeichen zu analysieren. Egal, wo ich in der Datei files.txt oder in meinem Shell-Befehl Anführungszeichen zu setzen scheine, es wird immer noch falsch analysiert. Was soll ich stattdessen tun?

Zu Ihrer Information, mein Dateilistendokument wird folgendermaßen ausgegeben:

find ~/Dropbox/ -type f -iname "*.BMP" >> bmpfound.txt

Meine Systemdetails: MacOS, mit oh-my-zsh in Terminal.app

Escape-Zeichen
quelle
Wenn Sie haben xargs, versuchen Sie es , cat files.txt|xargs -I{} du -hc "{}"aber dies wird wahrscheinlich mit Dateinamen mit scheitern ". Sicherer ist es vielleicht, es in einer Schleife zu machenwhile read line;do du -hc "$line";done <files.txt
Paulo
2
Wenn Ihr duarg nimmt, --files0-fromdann verwenden Sie das und ändern Sie Ihren Fund, um hinzuzufügen -print0.
18.02.18

Antworten:

2

Nutzen Sie die -print0Option in findund leiten Sie an xargs -0:

find ~/Dropbox/ -type f -iname "*.BMP" -print0 | xargs -0 du -ch

Alternativ, wie Gordon Davisson kommentierte, kann dies vereinfacht werden:

find ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +

Entweder sollte dies mit Dateinamen funktionieren, die Leerzeichen enthalten, oder mit irgendwelchen albernen Zeichen.

Ich bin mir nicht sicher, ob Sie beabsichtigt haben find, die Ausgabe absichtlich in eine Datei umzuleiten , anstatt sie weiterzuleiten, aber wenn Sie die Dateiliste tatsächlich beibehalten möchten, können Sie dies stattdessen tun:

xargs -0 du -ch < bmpfound.txt
ZeroKnight
quelle
1
Wenn Sie die nicht speichern müssen findErgebnisse in einer Datei, können Sie es sogar noch einfacher mitfind ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +
Gordon Davisson
@GordonDavisson Genial! Ich hatte die -exec duRoute anfangs ausprobiert , aber irgendwie die +Syntax völlig verfehlt . Das ist sehr praktisch.
ZeroKnight