我有一个文件,其中列出了包含通配符的文件和目录*
。我试图输出带有的条目的大小,du
并希望得到总计。
如果我从以下开始:
cat file | xargs du -hs
通配符*
未扩展。为此,我执行以下操作:
cat file | xargs -I@ sh -c 'du -hs @'
但如果我尝试:
cat file | xargs -I@ sh -c 'du -hsc @'
我总共得到每个(扩展)文件的条目。如果文件如下所示:
foo*
bar*
我会得到:
1K foo1
1K foo2
2K total
1K bar1
1K bar2
2K total
如何获取文件中所有条目的总数?如何du
对所有行仅运行一次?谢谢
答案1
cat file | xargs -I@ sh -c 'echo @' | xargs du -hsc
答案2
如果不需要 xargs,这也将产生总计du
:
du -hsc ${(f)~"$(<file)"}
假设file
每行有一个 glob 模式,并使用(f)
扩展标志将输入拆分为行。模式和文件名都可以包含空格。扩展GLOB_SUBST
( ${~...}
) 指示zsh
处理输入中的通配符。
如果模式仅由空格分隔,则(f)
不需要该标志:
setopt nullglob
du -hsc ${~$(<file)}
这将设置NULL_GLOB
选项。如果任何 glob 模式没有匹配的文件,则需要进行该设置。