如何在Bash中使用含空格文件名的变量作为du命令参数
Bash处理含空格文件名的磁盘使用统计问题
你的核心问题是用普通字符串变量存储文件名列表时,Bash的单词拆分机制会把文件名里的空格当成参数分隔符,导致带空格的文件被拆成多个无效参数传给du。下面是正确的解决方法:
推荐方案:使用Bash数组
数组是Bash中存储多元素列表的正确方式,它能完整保留每个文件名的原始格式,避免拆分问题。示例脚本:
#!/bin/bash # 定义数组,每个文件名作为独立元素(直接写带空格的文件名即可) FILE_LIST=( "/tmp/filename_without_spaces" "/tmp/filename with spaces" ) # 展开数组时必须加双引号,确保每个元素作为独立参数传递 du -shc "${FILE_LIST[@]}"
执行这个脚本,du就能正确识别所有文件,包括带空格的那个。
替代方案:用换行分隔字符串+while循环
如果因某些原因必须用字符串存储,可以用换行作为文件名的分隔符,再通过while read逐行读取处理:
#!/bin/bash FILE_LIST="/tmp/filename_without_spaces /tmp/filename with spaces" # 逐行读取文件名,IFS=防止首尾空格被截断,-r保留原始字符(比如反斜杠) echo "$FILE_LIST" | while IFS= read -r file; do du -sh "$file" done # 如需统计总大小,可通过awk汇总 echo "$FILE_LIST" | while IFS= read -r file; do du -s "$file" done | awk '{sum += $1} END {printf "%.1fG\ttotal\n", sum/1024/1024}'
你的测试脚本失败原因
- 前两种写法里的转义符
\会被当成文件名的一部分,而非语法上的空格转义,du会尝试访问/tmp/filename\这类不存在的文件。 - 第三种写法里的双引号是字符串的一部分,
du会寻找带引号的文件名(比如"/tmp/filename with spaces"),自然找不到对应文件。
内容的提问来源于stack exchange,提问作者sdorof
相关产品推荐
相关产品推荐

