du 指令 - 在輸出中顯示檔案或資料夾?

du 指令 - 在輸出中顯示檔案或資料夾?

如果我運行該命令,du -ah | sort -nr是否可以使其顯示輸出中的哪一行是檔案以及哪個資料夾?像這樣的指令會顯示前面ls -l帶有 和 的檔案和資料夾d-

答案1

這是有可能的,但需要另一個命令的幫助。具體來說,這裡我們使用 GNU awk (這很重要,所以檢查你的 awk 版本)

$ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}'             
24K .: directory
4.0K ./testdir: directory
4.0K ./out.txt: ASCII text
4.0K ./3.txt: ASCII text
4.0K ./2.txt: ASCII text
4.0K ./1.txt: ASCII text

當然,這種方法有一點缺陷,因為它似乎對包含空格的檔案名稱失敗(仍在努力改進它)

作為替代方案,我們也可以使用find命令來尋找所有檔案並執行file命令du來透過標誌執行我們的命令-exec,但這看起來有點難看(請參閱編輯歷史記錄)。但是,我們可以使用find's -printf標誌來列印%y具有更漂亮輸出格式的文件類型。

$ find -mindepth 1 -printf "%y\t" -exec  du "{}" \;  | sort -rn                                       
f   4   ./out.txt
f   4   ./3.txt
f   4   ./2.txt
f   4   ./1.txt
f   0   ./with space.txt
d   4   ./testdir

顯然這裡f適用於常規文件,d適用於目錄。有關標誌和文件類型字母的更多信息,請參閱find手冊

答案2

正如 Serg 所說,du僅靠自己無法做到這一點。為了安全地處理檔案名,最好的方法是用 ASCII nul 字元分隔它們(\0 ) 分隔它們,並且du可以這樣做。因此,使用它以及sort'xargs處理空分隔輸入的能力:

du -0ah |
  sort -zh |
  xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _

,和選項告訴-0,和使用 ASCII nul 作為分隔符號。-z-0dusortxargs

然後,s=${i%[[:space:]]*}取得行的開頭直到空格(即大小),並f=${i#*[[:space:]]}取得其他所有內容(檔案名稱)。然後我們可以ls列印帶有裝飾的檔案名稱。

例子:

$ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
512 Screenshots/desktop.ini*
264K Screenshots/Screenshot (1).png*
269K Screenshots/

因為我使用了ls --color,所以我也得到了很好的顏色輸出:

在此輸入影像描述

相關內容