查找带有空格和连字符的文件名的大小 |将包含空格和连字符的文件名传递给“du”

查找带有空格和连字符的文件名的大小 |将包含空格和连字符的文件名传递给“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 文件的大小?

答案1

xargs -Ifile du -sch file <filelist

只要文件名不包含换行符,上面就会调用du -sch代码就会调用filelist. -Ifile将导致用从 读取的每个名称替换命令中的xargs字符串。filedu -sch filefilelist

这将正确处理带有空格和 shell 通配模式的文件名(模式不会扩展)。

答案2

IFS由于您没有在命令替换周围添加引号,因此此处将根据(默认情况下为空格、制表符、换行符)的值进行分词。文件名中有空格,因此例如/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

相关内容