Disk-Usage

du -sh –exclude={} 命令中的 cat/echo 命令導致長時間執行且無法按預期執行

  • January 10, 2020

我是這個頁面的崇拜者,我希望我能在這裡找到我的答案。

所以,我想檢查所有目錄在特定文件系統中的磁碟使用情況,不包括少數目錄(我儲存在一個文件中,根據一些要求動態創建)。

但我觀察到的是,當我直接在 exclude 命令中硬編碼這些值時,它速度很快,結果也很準確。但是當我通過排除命令中的命令時。這更加耗時並且產生了錯誤的結果。我不想總是硬編碼,請建議

編碼版本(a、b 是子目錄)——給出了正確的結果

du -sh --exclude={a,b} filesystem/*

命令版本

假設我有一個文件(directory_list.txt),其中包含 a 和 b 目錄名稱。

du -sh --exclude={`cat directory_list.txt`} /filesystem/*

我想到的另一件事是排除沒有給我帶來準確和及時的結果,我將直接選擇我想要的目錄

如下

ls filesystem/ | grep -v $(cat directory_list.txt) > selected.txt  --

排除目錄並只選擇需要的

du -sh $(cat selected.txt)

但是請提出更好的方法以及如何使我的命令在排除命令中起作用謝謝穆罕默德

Linux 上的du命令似乎是您正在使用的,它提供了一個--exclude-from選項:

du -h -s --exclude-from=directory_list.txt /filesystem/*

或者

du -h -s -X directory_list.txt /filesystem/*

這假定該文件directory_list.txt包含外殼通配模式(不是正則表達式),每行一個,應該被排除。這些模式可能是路徑名,或者只是文件或目錄的名稱,並且可能包括 shell 萬用字元。


在您使用的命令中--exclude={cat directory_list.txt},您試圖讓 shell 使用directory_list.txt. 這不起作用,因為在考慮命令替換之前就執行了大括號擴展。

如果您沒有,您可以做的是將要從文件中排除的內容讀取到數組中,並在這樣做的同時添加到每個元素,然後在呼叫中使用該數組:du``--exclude-from``--exclude=``du

exclude=()
while IFS= read -r item; do
   exclude+=( --exclude="$item" )
done <directory_list.txt

du -h -s "${exclude[@]}" /filesystem/*

這假設,就像 with 一樣--exclude-from,您的文件每行包含一個模式。

如果您使用的 shell 不支持數組,則可以減少輸入:

set --
while IFS= read -r item; do
   set -- "$@" --exclude="$item"
done <directory_list.txt

du -h -s "$@" /filesystem/*

這使用位置參數列表而不是命名數組。

這兩個循環也會保留路徑名中的空格,並且不允許 shell 錯誤地擴展文件名通配模式,這是您的grep -v $(cat directory_list.txt)命令的幾個問題(另一個是您會將文件中的大部分路徑名傳遞到grep作為要搜尋的文件而不是要排除的模式)。

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