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.txt
Dann wird du -hc
versucht, 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
macos
command-line
shell
pipe
Escape-Zeichen
quelle
quelle
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
du
arg nimmt,--files0-from
dann verwenden Sie das und ändern Sie Ihren Fund, um hinzuzufügen-print0
.Antworten:
Nutzen Sie die
-print0
Option infind
und leiten Sie anxargs -0
:Alternativ, wie Gordon Davisson kommentierte, kann dies vereinfacht werden:
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:quelle
find
Ergebnisse in einer Datei, können Sie es sogar noch einfacher mitfind ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +
-exec du
Route anfangs ausprobiert , aber irgendwie die+
Syntax völlig verfehlt . Das ist sehr praktisch.