
Ich habe eine Datei mit einer Liste von Dateien und Verzeichnissen, die das Platzhalterzeichen enthält *
. Ich versuche, die Größe der Einträge mit auszugeben du
und hätte gerne eine Gesamtsumme.
Wenn ich beginne mit:
cat file | xargs du -hs
das Platzhalterzeichen *
wird nicht erweitert. Dazu gehe ich wie folgt vor:
cat file | xargs -I@ sh -c 'du -hs @'
Aber wenn ich es versuche:
cat file | xargs -I@ sh -c 'du -hsc @'
Ich erhalte eine Summe fürjede(erweiterter) Eintrag der Datei. Sieht die Datei so aus:
foo*
bar*
Ich werde bekommen:
1K foo1
1K foo2
2K total
1K bar1
1K bar2
2K total
Wie erhalte ich die Gesamtsumme aller Einträge in der Datei? Wie kann ich du
alle Zeilen nur einmal ausführen? Danke
Antwort1
cat file | xargs -I@ sh -c 'echo @' | xargs du -hsc
Antwort2
Wenn xargs nicht erforderlich ist, wird auch eine Gesamtsumme mit folgendem Ergebnis erzeugt du
:
du -hsc ${(f)~"$(<file)"}
Dies setzt voraus, dass file
pro Zeile ein Glob-Muster vorhanden ist, und verwendet das (f)
Erweiterungsflag, um die Eingabe in Zeilen aufzuteilen. Sowohl das Muster als auch die Dateinamen können Leerzeichen enthalten. Die GLOB_SUBST
Erweiterung ( ${~...}
) weist an, zsh
die Platzhalter in der Eingabe zu verarbeiten.
Wenn die Muster nur durch Leerzeichen getrennt sind, (f)
wird das Flag nicht benötigt:
setopt nullglob
du -hsc ${~$(<file)}
Dadurch wird die NULL_GLOB
Option festgelegt. Diese Einstellung ist erforderlich, wenn für eines der Glob-Muster keine passenden Dateien vorhanden sind.