如何让find命令输出带引号或转义处理的路径?
解决
find输出含特殊字符文件名的处理问题 针对你遇到的文件名含空格/特殊字符导致脚本出错的问题,有几种可靠的处理方式,完全规避手动转义的麻烦:
1. 最推荐:find -print0 + xargs -0
这是处理特殊文件名的标准方案,利用空字符作为文件名分隔符(空字符不会出现在任何合法文件名中),彻底避免空格、引号、反斜杠等字符的干扰:
# 遍历目录并传递给xargs执行命令 find /目标路径 -depth -print0 | xargs -0 你的命令 # 比如你提到的设置文件时间的场景 find /目标路径 -depth -print0 | xargs -0 touch -t 202401011200
如果要直接在find里执行命令,还可以用-exec的批量模式,效果和xargs -0一致,无需管道:
find /目标路径 -depth -exec 你的命令 {} +
{}会被替换为匹配到的文件名,+表示批量传递(和xargs一样减少进程创建次数)。
2. 适配shell for循环的处理(Bash/zsh)
如果一定要用for循环遍历,不要直接用管道输出(会被IFS拆分),而是通过空分隔读取的方式构建数组:
# Bash环境下先开启nullglob(避免无匹配时出现字面量) shopt -s nullglob # 用while循环读取空分隔的文件名,存入数组 files=() while IFS= read -r -d '' file; do files+=("$file") done < <(find /目标路径 -depth -print0) # 遍历数组,注意引号包裹变量 for file in "${files[@]}"; do # 这里处理$file,比如从EXIF设置时间 exiftool "-FileModifyDate<DateTimeOriginal" "$file" done
这种方式能完整保留所有特殊字符,不会拆分文件名。
为什么-printf加引号的方法不可行?
你尝试的-printf '"%p" '会把引号作为文件名的一部分,而且shell的for循环会按默认的IFS(空格、制表符、换行)拆分内容,即使有引号,空格依然会被当成分隔符,导致文件名被拆成多个部分,所以这种方法本质上不可靠。
内容的提问来源于stack exchange,提问作者RJVB
相关产品推荐
相关产品推荐

