Wie führe ich das Dienstprogramm xargs auf allen erweiterten Eingabezeilen aus?

Wie führe ich das Dienstprogramm xargs auf allen erweiterten Eingabezeilen aus?

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 duund 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 dualle 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 filepro 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_SUBSTErweiterung ( ${~...}) weist an, zshdie 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_GLOBOption festgelegt. Diese Einstellung ist erforderlich, wenn für eines der Glob-Muster keine passenden Dateien vorhanden sind.

verwandte Informationen