如何在所有扩展的输入行上运行 xargs 实用程序?

如何在所有扩展的输入行上运行 xargs 实用程序?

我有一个文件,其中列出了包含通配符的文件和目录*。我试图输出带有的条目的大小,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 模式没有匹配的文件,则需要进行该设置。

相关内容