You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Linux中自动递归替换目录与文件名的空格为下划线?

递归替换Linux目录和文件名中的空格为下划线

嘿,你的“递归”表述完全准确!要批量处理所有层级子目录里的空格文件名/目录名,确实需要遍历整个目录树,这里有几个靠谱的方法:

方法一:用find + Perl版rename(推荐)

大多数主流Linux发行版(比如Ubuntu、Debian)默认的rename是Perl版本的,配合find就能轻松实现递归处理:

find . -depth -name "* *" -exec rename 's/ /_/g' {} +
  • find .:从当前目录开始递归查找所有文件和目录
  • -depth关键参数,让find先处理子目录里的文件/目录,再处理父目录。如果先改父目录名字,后续子目录的路径就会失效,导致找不到文件
  • -name "* *":只匹配名字包含空格的文件/目录
  • -exec rename 's/ /_/g' {} +:把找到的对象传给rename,用正则替换所有空格为下划线

先测试再执行(避免误操作)

如果怕改错,可以先加上-n参数预览要修改的内容,不会实际更改:

find . -depth -name "* *" -exec rename -n 's/ /_/g' {} +

方法二:兼容非Perl版rename(比如CentOS/RHEL)

有些发行版的rename是简化版(比如CentOS),不支持Perl正则,这时候可以用mv配合sed来实现:

find . -depth -name "* *" -exec bash -c 'mv -v "$1" "$(echo "$1" | sed "s/ /_/g")"' _ {} \;
  • bash -c '...':启动一个新的bash会话执行命令
  • "$1":接收find传过来的文件/目录路径,用双引号包裹避免空格拆分参数
  • sed "s/ /_/g":把路径里的所有空格替换为下划线
  • -v:让mv显示每一步的操作,方便你确认

额外注意事项

  • 如果文件名里包含特殊字符(比如&!),上述命令里的双引号已经帮你处理了,不用担心参数解析错误
  • 如果你只想处理文件(不处理目录),可以给find加上-type f参数;只想处理目录就加-type d
  • 执行命令前建议备份重要文件,虽然这些命令很可靠,但小心驶得万年船

内容的提问来源于stack exchange,提问作者JoBe

火山引擎 最新活动