Disk-Usage

語句的含義 -du -sk * |sort -rn|head

  • January 4, 2022

我在理解這個 Linux 命令的含義時遇到了麻煩:

du -sk * | sort -rn | head

我知道 du 用於顯示磁碟使用情況,但我在理解命令的其餘部分時遇到了麻煩。有人可以分解這裡到底發生了什麼嗎?還可以建議一些好的資源來詳細研究複雜的linux命令嗎?

a | b | c執行abc在單獨的程序中同時執行,一個命令的標準輸出通過管道連接到下一個命令的標準輸入。

這裡,adu -sk **由 shell 擴展為目前目錄中按詞法排序的非隱藏文件的名稱(如果沒有非隱藏文件,則中止命令並出現錯誤或擴展為文字*,具體取決於 shell)。

在這裡,如果任何文件的名稱以 開頭-,則將被 視為選項du,因此正確的語法應為:du -sk -- *,以--確保不將超過它的任何內容視為選項。

-k是以千字節為單位獲取磁碟使用情況(1024 字節,在標準du實現中預設為 512 字節單位¹)。-s是對每個文件的磁碟使用情況進行匯總(對於目錄類型的文件,沒有給出所有子目錄的詳細資訊)。

因此它將列印目前目錄中所有非隱藏文件的磁碟使用情況(對於那些類型目錄的累積),其中 kibibyte 的數量後跟同一行的文件名(儘管要注意文件名可能由不止一行)。

在許多du實現中,如果某些參數引用同一個文件(硬連結)或在多個目錄中找到同一個文件,則輸出中將僅計算第一次出現的磁碟使用情況。

sort -rn sorts其輸入的行在neverse 中r,因此假設沒有文件名包含換行符,將從最大到最小對文件/目錄進行排序(就磁碟使用而言)。

head(縮寫head -n 10)丟棄除前 10 行以外的所有輸出sort

一個更正確的版本,這些實用程序的 GNU 實現將是:

du -skl0 ./* | sort -zk1,1rn | head -z | tr '\0' '\n'

其中-l強制考慮所有硬連結,-0/ -zoutputs/processes 記錄以 NUL 分隔,因此它對於包含換行符的文件名更有效(並且./前綴可以指示每個文件名在輸出中包含換行符的位置)除了避免以 ) 開頭的文件名問題-;使用sort -k1,1rn而不是sort -rn更改關係的情況下的行為(兩個文件具有相同的磁碟使用情況),避免在詞法上反向排序關係。


¹對於 GNU du,預設值為千字節,但可以用環境變數覆蓋,包括POSIXLY_CORRECT, DU_BLOCK_SIZE, BLOCK_SIZE,BLOCKSIZE

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