对含空格父目录下的文件执行去空格重命名时出现报错
报错原因与解决方案
核心报错原因
- 你使用的Perl版本
rename工具的替换规则默认作用于完整的输入路径字符串,而非仅作用于路径末尾的文件名部分 - 你编写的
s/ //规则会匹配整个路径中的第一个空格,示例路径的第一个空格位于父目录./FOLDER WITH SPACES的名称中,替换后路径变为不存在的./FOLDERWITH SPACES,因此触发文件不存在报错 - 你指定
-type f仅筛选文件、用-print0 | xargs -0处理空格传参的操作都是正确的,问题仅出在正则的替换范围不符合预期
可行解决方案
方案1:调整rename正则,仅替换文件名内的空格
修改正则规则,限定仅匹配路径最后一个/之后的空格:
find . -type f -name '* *' -print0 | xargs -0 rename 's/ (?=[^\/]*$)//g'
说明:正则中的(?=[^\/]*$)是正向预查规则,仅匹配后方没有/字符的空格,也就是仅匹配文件名内的空格;末尾的g代表全局替换,会删除文件名中的所有空格。
方案2:拆分路径处理,兼容性更强
该方案不依赖Perl版rename,适配所有Ubuntu默认环境,避免不同版本rename的语法差异:
find . -type f -name '* *' -exec bash -c ' dir=$(dirname "$0") filename=$(basename "$0") mv "$0" "$dir/${filename// /}" ' {} \;
说明:先通过dirname和basename拆分出父目录路径与纯文件名,通过bash变量替换${filename// /}删除文件名内的所有空格,再执行重命名操作,完全不会修改父目录名称,规避路径错误问题。
内容的提问来源于stack exchange,提问作者Pedro Montesinos Navarro
相关产品推荐
相关产品推荐

