Shell
用空格和連字元查找文件名的大小 |將包含空格和連字元的文件名傳遞給“du”
我有一個文件,其中包含一些文件的名稱。我想在列表中找到文件的總大小。
#cat filelist /tmp-directory/connector_db_ connector_db /tmp-directory/connector_db -connector_db /tmp-directory/connector_db_connector_db
如您所見,文件名包含空格,更糟糕的是連字元 (-)。我正在嘗試使用以下命令查找這些文件的總大小。
#du -sch `cat filelist` du: invalid option -- 'o' du: invalid option -- 'n' du: invalid option -- 'n' du: invalid option -- 'e' du: invalid option -- 't' du: invalid option -- 'o' du: invalid option -- 'r' du: invalid option -- '_' du: invalid maximum depth `b'
我嘗試添加“”,如下所示,然後嘗試也失敗了
#cat filelist "/tmp-directory/connector_db_ connector_db" "/tmp-directory/connector_db -connector_db" "/tmp-directory/connector_db_connector_db" #du -sch `cat filelist` du: invalid option -- 'o' du: invalid option -- 'n' .....
但是當我直接在shell中使用下面的命令時,這有效。
#du -sch "/tmp-directory/connector_db -connector_db" 0 /tmp-directory/connector_db -connector_db 0 total
那麼,遇到這樣的情況該如何處理。我有3 個lac文件的文件列表。更糟糕的是,當文件列表超過 20000 左右時,“du -sch”不會處理列表。我使用 split 命令將列表拆分為 20000 行。有沒有其他方法可以輕鬆找到 3 個 lac 文件的大小?
由於您沒有在命令替換周圍加上引號,因此這裡會根據
IFS
(space, tab, newline 預設情況下) 的值進行分詞。您的文件名中有空格,因此 eg/tmp-directory/connector_db_ connector_db
被分成兩個單詞 –/tmp-directory/connector_db_
,connector_db
.您可以逐個迭代文件名:
while IFS= read -r file; do du -sch -- "$file"; done <filelist
由於您的文件很大,這可能需要一些時間。
此外,由於文件是單獨解析的,因此您不會獲得
du
. 所以你可以放棄-s
和-c
:while IFS= read -r file; do du -h -- "$file"; done <filelist
xargs -Ifile du -sch file <filelist
只要沒有文件名包含換行符,上面的程式碼就會
du -sch
呼叫filelist
.-Ifile
將導致用從 讀取的每個名稱替換命令中xargs
的字元串。file``du -sch file``filelist
這將正確處理帶有空格和 shell globbing 模式的文件名(不會擴展模式)。