如何在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




