Pipe
將文件和目錄的管道列表傳輸到 du 僅顯示目錄的大小?
假設我有一個包含多個子目錄的目錄,每個子目錄都包含一些文件:
1/a.txt 1/b.txt 2/c.txt 2/d.txt 3/e.txt 3/f.txt
我想查看每個文件的大小。請記住,我知道有更簡單、更直接的方法可以做到這一點,例如
du -a
. 出於教育目的,我只想知道為什麼以下內容不起作用。我毫無意義的練習
執行
find .
返回所有文件和目錄的列表,所以我嘗試像這樣管道它:find . | xargs du
但這只是返回目錄 1、2 和 3 的大小。我缺少一些理解,因為在我看來
xargs
應該將每一行輸出映射find
到對du
.如果相反,我使用:
find . | xargs du -a
然後它按預期工作,列出所有文件和目錄的大小。如果我只使用該
-type f
選項將文件列表傳遞給它,它也可以正常工作,因此它與接收與文件混合的目錄列表有關。這裡發生了什麼?
正在發生的事情是
xargs
將(如果可以的話)所有名稱放在一個命令行上,以便您只看到一個傳遞給du
. 然後du
忽略文件名(如您所料:文件是目錄的一部分,它不計算兩次)。如果您使用
-n 1
參數 toxargs
,它會將命令拆分,您將看到更多您所期望的內容。
find . | xargs -n 1 du -a
我們可以使用下面的命令
find path -type f -printf "%s %p\n"