Bash脚本删除含空格路径文件报错,寻求解决办法
解决Bash脚本中含空格路径找不到的问题
你猜得完全没错!就是路径里的空格在搞鬼——虽然你给$files_path加了双引号,但"$files_path/files/*"这个写法有个坑:当整个路径被引号包裹时,Shell会把*当成字面字符,而不是通配符去匹配文件,所以系统会傻乎乎地去找一个名叫*的文件,自然提示找不到路径。
给你几个靠谱的解决办法:
方法1:拆分路径,只给变量加引号
把通配符留在引号外面,让Shell正常解析它:
#!/bin/bash files_path="/Volumes/HDD/Bogdan Data/" rm -r "$files_path"files/*
这样$files_path会被正确解析为带空格的完整路径,和files/拼接后,*就能正常展开该目录下的所有内容了。
方法2:用花括号明确变量边界
如果怕路径拼接时出现歧义,可以用花括号把变量包起来,更清晰:
#!/bin/bash files_path="/Volumes/HDD/Bogdan Data/" rm -r "${files_path}files/*"
花括号${files_path}明确告诉Shell变量的结束位置,避免和后面的字符混淆,效果和方法1一致。
方法3:用find命令彻底避开通配符问题
如果你的场景更复杂,或者不想纠结引号的写法,用find命令更稳妥:
#!/bin/bash files_path="/Volumes/HDD/Bogdan Data/files/" find "$files_path" -mindepth 1 -delete
-mindepth 1确保不会删除files目录本身,只清理里面的所有文件和子目录;-delete直接执行删除操作,全程不需要处理通配符,完美适配带空格的路径。
小提醒
执行删除命令前,建议先把rm -r换成echo,比如echo "$files_path"files/*,看看输出的路径是否符合预期,确认无误后再换成rm,避免误删重要文件!
内容的提问来源于stack exchange,提问作者Silithus
相关产品推荐
相关产品推荐

