Shell

用空格和連字元查找文件名的大小 |將包含空格和連字元的文件名傳遞給“du”

  • June 9, 2017

我有一個文件,其中包含一些文件的名稱。我想在列表中找到文件的總大小。

#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 模式的文件名(不會擴展模式)。

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