You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量重命名目录及子目录下的文件?现有脚本仅支持当前目录

递归批量重命名文件(含子目录)

没问题,要让你的脚本支持遍历所有子目录的文件,我们可以借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:21