
如果我運行該命令,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
-0
du
sort
xargs
然後,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
,所以我也得到了很好的顏色輸出: