如何在grep结果中添加转义字符?照片分类脚本移动文件遇阻
解决带空格文件名的移动问题
不要用ls+grep的方式获取文件名——这种方式会让Shell把文件名里的空格当成参数分隔符,导致单个文件名被拆成多个片段,mv自然找不到文件。推荐两种更可靠的方案:
方案一:用Shell通配符(Glob)直接匹配
先提取目录前缀,然后用通配符匹配所有对应文件,循环移动时用引号包裹变量保留完整文件名:
# 提取目录名前缀(比如从directories/Oranges得到Oranges) PREFIX=${DIR#*directories/} # 遍历所有以该前缀开头的文件 for file in "/Users/ithomas/Desktop/files/${PREFIX}"*; do # 跳过通配符匹配不到文件时生成的空条目 if [ -f "$file" ]; then mv "$file" "$DIR" fi done
方案二:用find命令(更适合复杂文件名)
如果文件名包含空格之外的特殊字符(比如括号、引号),find的处理更稳妥:
PREFIX=${DIR#*directories/} # 只在files目录下查找符合前缀的文件,找到后直接移动 find "/Users/ithomas/Desktop/files" -maxdepth 1 -type f -name "${PREFIX}*" -exec mv {} "$DIR" \;
关键注意点
- 所有涉及文件名的变量都要用双引号
""包裹,避免Shell拆分文件名。 - 永远不要用
ls的输出作为文件名列表处理,这是Shell脚本的经典陷阱。
内容的提问来源于stack exchange,提问作者ee_un
相关产品推荐
相关产品推荐

