我有一个文件,其中包含一些文件的名称。我想找到列表中文件的总大小。
#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
字符串。file
du -sch file
filelist
这将正确处理带有空格和 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