
我有一個包含文件和目錄列表的文件,其中包含通配符*
。我正在嘗試輸出條目的大小,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 模式沒有符合文件,則需要進行該設定。