Pipe

將文件和目錄的管道列表傳輸到 du 僅顯示目錄的大小?

  • November 27, 2019

假設我有一個包含多個子目錄的目錄,每個子目錄都包含一些文件:

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參數 to xargs,它會將命令拆分,您將看到更多您所期望的內容。

find . | xargs -n 1 du -a

我們可以使用下面的命令

 find path -type f -printf "%s %p\n"

引用自:https://unix.stackexchange.com/questions/304692