語句的含義 -du -sk * |sort -rn|head
我在理解這個 Linux 命令的含義時遇到了麻煩:
du -sk * | sort -rn | head
我知道 du 用於顯示磁碟使用情況,但我在理解命令的其餘部分時遇到了麻煩。有人可以分解這裡到底發生了什麼嗎?還可以建議一些好的資源來詳細研究複雜的linux命令嗎?
a | b | c
執行a
,b
並c
在單獨的程序中同時執行,一個命令的標準輸出通過管道連接到下一個命令的標準輸入。這裡,
a
是du -sk *
。*
由 shell 擴展為目前目錄中按詞法排序的非隱藏文件的名稱(如果沒有非隱藏文件,則中止命令並出現錯誤或擴展為文字*
,具體取決於 shell)。在這裡,如果任何文件的名稱以 開頭
-
,則將被 視為選項du
,因此正確的語法應為:du -sk -- *
,以--
確保不將超過它的任何內容視為選項。
-k
是以千字節為單位獲取磁碟使用情況(1024 字節,在標準du
實現中預設為 512 字節單位¹)。-s
是對每個文件的磁碟使用情況進行匯總(對於目錄類型的文件,沒有給出所有子目錄的詳細資訊)。因此它將列印目前目錄中所有非隱藏文件的磁碟使用情況(對於那些類型目錄的累積),其中 kibibyte 的數量後跟同一行的文件名(儘管要注意文件名可能由不止一行)。
在許多
du
實現中,如果某些參數引用同一個文件(硬連結)或在多個目錄中找到同一個文件,則輸出中將僅計算第一次出現的磁碟使用情況。
sort -rn
sort
s其輸入的行在n
everse 中r
,因此假設沒有文件名包含換行符,將從最大到最小對文件/目錄進行排序(就磁碟使用而言)。
head
(縮寫head -n 10
)丟棄除前 10 行以外的所有輸出sort
。一個更正確的版本,這些實用程序的 GNU 實現將是:
du -skl0 ./* | sort -zk1,1rn | head -z | tr '\0' '\n'
其中
-l
強制考慮所有硬連結,-0
/-z
outputs/processes 記錄以 NUL 分隔,因此它對於包含換行符的文件名更有效(並且./
前綴可以指示每個文件名在輸出中包含換行符的位置)除了避免以 ) 開頭的文件名問題-
;使用sort -k1,1rn
而不是sort -rn
更改關係的情況下的行為(兩個文件具有相同的磁碟使用情況),避免在詞法上反向排序關係。¹對於 GNU
du
,預設值為千字節,但可以用環境變數覆蓋,包括POSIXLY_CORRECT
,DU_BLOCK_SIZE
,BLOCK_SIZE
,BLOCKSIZE