Befehlszeile: Wie werden Leerzeichen in Dateinamen behandelt?

517
escapecharacter

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 gewünschte Ausgabe:

$ du -hc $(cat files.txt) 

Es sei denn, ich habe einen Dateinamen mit Leerzeichen, z. B .: file 9.txtDann du -hcversucht der Dateiname am Leerzeichen zu analysieren. Unabhängig davon, wo ich Anführungszeichen in files.txt oder in meinem Shellbefehl zu setzen scheine, wird immer noch falsch analysiert. Was soll ich stattdessen tun?

Zu Ihrer Information, mein Dateilistendokument wird wie folgt von einem Befehl ausgegeben:

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

Meine Systemdetails: MacOS unter Verwendung von oh-my-zsh in Terminal.app

1
Wenn Sie `xargs` haben, probieren Sie` cat files.txt | xargs -I {} du -hc "{}" `, aber das wird wahrscheinlich mit Dateinamen mit` "` fehlschlagen. Sicherer ist es vielleicht, das zu tun Schleife `während Lesezeile; do du -hc" $ line "; fertig Paulo vor 6 Jahren 0
Wenn Ihr "du" arg "--files0-from" nimmt, verwenden Sie das und ändern Sie Ihre Suche, um "-print0" hinzuzufügen. meuh vor 6 Jahren 2

1 Antwort auf die Frage

1
ZeroKnight

Nutzen Sie die -print0Option in findund lassen Sie zu xargs -0:

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

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

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

Beide sollten mit Dateinamen arbeiten, die Leerzeichen enthalten, oder auf irgendeine Art von doof-Zeichen.

Ich bin nicht sicher, ob Sie beabsichtigen find, die Ausgabe der Ausgabe absichtlich in eine Datei umzuleiten, anstatt sie weiterzuleiten. Wenn Sie jedoch die Dateiliste beibehalten möchten, können Sie stattdessen Folgendes tun:

xargs -0 du -ch < bmpfound.txt 
Wenn Sie die `find`-Ergebnisse nicht in einer Datei speichern müssen, können Sie dies mit` find ~ / Dropbox / -type f -iname "* .BMP" -exec du -ch {} + `noch einfacher machen Gordon Davisson vor 6 Jahren 1
@ GordonDavisson Brilliant! Ich hatte anfangs die "-exec du" -Route ausprobiert, aber irgendwie die "+" - Syntax völlig verfehlt. Das ist sehr praktisch. ZeroKnight vor 6 Jahren 0