如何在所有擴充的輸入行上執行 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每行有一個全域模式,並使用(f)擴展標誌將輸入拆分為行。模式和檔案名稱都可以包含空格。擴展GLOB_SUBST( ${~...}) 指示zsh處理輸入中的通配符。

如果模式只是用空格分隔,則(f)不需要該標誌:

setopt nullglob
du -hsc ${~$(<file)}

這將設定該NULL_GLOB選項。如果任何 glob 模式沒有符合文件,則需要進行該設定。

相關內容