使用Bash移除文件名指定字符串失败,求正确解决方案
解决util-linux版rename修改文件名失败的问题
你用的是util-linux 2.23.2版本的rename工具,这个版本和常见的Perl版rename语法完全不同,你之前写的Perl风格正则替换命令自然不会生效。
问题原因
Perl版rename支持's/正则表达式/替换内容/'的写法,但util-linux版rename是简单的字符串替换工具,语法为:
rename [选项] 待替换的字符串 替换后的字符串 目标文件
它不支持Perl正则语法,所以你之前的两条命令都会执行失败。
两种可行解决方案
方案1:用bash循环+mv命令(推荐,一次到位)
利用bash的参数扩展功能,直接提取文件名中第一个.之前的部分:
for file in *; do mv -v "$file" "${file%%.*}" done
${file%%.*}是bash内置的参数处理逻辑:%%表示从字符串末尾开始,删除最长的匹配.*的内容,也就是直接去掉第一个.及之后的所有字符,正好得到你想要的文件名。
方案2:用util-linux版rename分两步操作
如果一定要用rename工具,可以分两次替换:
- 先去掉末尾的
.vesta-01:2,:
rename -v '.vesta-01:2,' '' *
执行后文件名会变成1667874526.M308257P1693这类格式。
2. 再去掉.开头的剩余部分:
rename -v '.M*' '' *
这样就能得到最终的1667874526格式文件名。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

