You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:58:24