Linux批量修改文件后缀名推荐使用Perl版rename命令或for+mv组合:前者支持正则精准替换末尾扩展名,需先用-n预览;后者兼容性强,依赖Bash参数扩展${file%.*}安全剥离后缀,务必加双引号并启用nullglob防误操作。

Linux 批量修改文件后缀名,核心是安全、精准地替换文件名末尾的扩展名,避免误改文件名主体或含特殊字符时出错。最常用且推荐的方式是结合 rename(Perl 版) 和 for + mv 两种方案,前者高效简洁,后者通用可靠。
用 rename 命令(Perl 版)精准替换
这是最直接的方法,支持正则匹配“行尾”,只动后缀,不碰文件名里的同名字符串。
- 先确认版本:运行
rename --version,看到File::Rename或perl字样才是 Perl 版;若显示util-linux,它不支持正则,慎用 - 把当前目录所有
.txt改成.md:rename 's/\.txt$/.md/' *.txt - 务必先预览:加
-n参数,例如rename -n 's/\.log$/.bak/' *.log,会列出将要执行的操作,无误再删掉-n实际执行 - 含空格或子目录?搭配
find更稳妥:find . -name "*.txt" -exec rename -n 's/\.txt$/.md/' {} +
用 for 循环 + mv 命令兼容所有环境
不依赖额外工具,Bash 内置功能,适合 rename 不可用、版本混乱或需精细控制的场景。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 基本写法:进入目标目录后运行
for file in *.txt; do mv "$file" "${file%.txt}.md"; done -
${file%.txt}是 Bash 参数扩展,安全剥离结尾的.txt,比sed或basename更轻量 - 双引号必须:包裹
"$file"和"${file%.txt}.md",否则含空格、括号、中文的文件名会出错 - 防通配符无匹配:在循环前加
shopt -s nullglob,避免*.txt没有文件时误操作字面量*.txt
跨子目录递归修改,用 find + -exec
当文件分散在多层子目录中,单靠通配符 *.ext 无法覆盖,这时 find 是唯一可靠选择。
- 把当前目录及所有子目录下的
.old全部改为.new:find . -type f -name "*.old" -exec bash -c 'mv "$1" "${1%.old}.new"' _ {} \; - 更高效写法(一次调用多个文件):
find . -type f -name "*.old" -exec rename 's/\.old$/.new/' {} +(需 Perl 版 rename 可用) -
-type f确保只处理普通文件,跳过目录和符号链接,避免意外错误
别踩这些坑
看似简单,实际容易翻车的地方集中在细节上:
- 不要用 util-linux 版
rename .txt .md *.txt——它会把readme.txt.bak错改成readme.md.bak - 测试前先复制一份样本目录,或用
echo替代mv预览:for file in *.txt; do echo "mv $file ${file%.txt}.md"; done - 注意 shell 的 glob 行为:如果当前目录没有
.txt文件,*.txt会原样传入循环,导致创建名为*.txt的文件——nullglob能解决 - 大小写敏感:Linux 默认区分大小写,
*.TXT和*.txt是两回事,必要时用shopt -s nocaseglob

















