如何批量重命名目录及子目录下的文件?现有脚本仅支持当前目录
递归批量重命名文件(含子目录)
没问题,要让你的脚本支持遍历所有子目录的文件,我们可以借助find命令实现递归查找,再结合Bash的参数展开完成替换。这里有两种可靠的方案:
方案1:通用Bash脚本(兼容所有系统)
这个写法不需要额外工具,纯Bash就能搞定,还能完美处理带空格或特殊字符的文件名:
find . -type f -name "*@me01*" -exec bash -c 'mv "$0" "${0/@me01/_me01}"' {} \;
各部分解释:
find .:从当前目录开始,递归遍历所有子目录-type f:只处理文件(如果需要连目录也一起重命名,直接去掉这个参数即可)-name "*@me01*":匹配所有文件名包含@me01的目标文件-exec bash -c '...' {} \;:对每个找到的文件执行后面的Bash命令,{}会自动替换成当前找到的文件完整路径${0/@me01/_me01}:用Bash的参数展开功能,把文件路径中的@me01替换成_me01;如果要替换文件名中所有出现的@me01,把单个@改成两个//即可,也就是${0//@me01/_me01}
方案2:用rename命令(更简洁,需系统支持)
如果你的系统安装了Perl版本的rename(大部分Linux发行版默认自带),可以用更简洁的写法:
find . -type f -name "*@me01*" -exec rename 's/@me01/_me01/g' {} \;
这里的s/@me01/_me01/g是Perl正则替换语法,g表示全局替换所有匹配的字符串。
重要测试建议
在实际执行重命名前,建议先把mv改成echo mv(或者rename改成echo rename),这样可以先预览要执行的命令,确认替换逻辑没问题后再去掉echo:
# 预览命令,不会实际修改文件 find . -type f -name "*@me01*" -exec bash -c 'echo mv "$0" "${0/@me01/_me01}"' {} \;
内容的提问来源于stack exchange,提问作者Rata
相关产品推荐
相关产品推荐

