批量重命名文件(替换文件名)
这是最常见的“替换”需求之一。rename 命令是专门为此设计的,但它的语法有两种主流版本,在使用前务必确认你的系统是哪一种。

方法 1: Perl 风格的 rename (功能最强大)
这是现代 Ubuntu 版本(如 18.04+)中默认的版本,功能非常强大,使用 Perl 表达式。
语法:
rename 's/搜索文本/替换文本/' 文件名模式
s是 substitute (替换) 的意思。- 是分隔符,你也可以用其他字符, 或 ,当文件名中包含 时很有用。
文件名模式可以使用通配符,如*.txt。
示例:
-
将文件名中的 "old" 替换为 "new"
(图片来源网络,侵删)# 假设有文件: old_file1.txt, old_file2.txt, my_old_file.txt rename 's/old/new/' * # 执行后文件变为: new_file1.txt, new_file2.txt, my_new_file.txt
-
将下划线
_替换为连字符# 假设有文件: my_file_name.jpg rename 's/_/-/g' *.jpg # 执行后文件变为: my-file-name.jpg
注意:这里的
g是 global 的意思,表示替换一行中所有的匹配项,对于文件名来说,通常意味着替换所有匹配。 -
将文件名中的 "log" 替换为 "log_2025"
rename 's/log/log_2025/' *.log
-
删除文件名中的所有数字
(图片来源网络,侵删)rename 's/[0-9]//g' * # [0-9] 是一个正则表达式,匹配任意一个数字
方法 2: prename (Perl rename 的别名)
rename 命令指向的是旧版本,你可以直接使用 prename 命令,它总是指向功能强大的 Perl 版本。
# 效果与上面的方法1完全相同 prename 's/old/new/' *
方法 3:使用 mv 和 for 循环 (最通用)
如果你的系统没有 rename 命令,或者你不熟悉它的语法,可以使用 for 循环配合 mv 命令,这种方法更直观,但稍显繁琐。
语法:
for f in 文件名模式; do mv "$f" "${f//搜索文本/替换文本}"; done
"${f//.../...}"是 Bash 的参数扩展功能,用于在变量中进行全局替换。
示例:
将所有 .txt 文件中的 "apple" 替换为 "orange"。
for f in *.txt; do mv "$f" "${f//apple/orange}"; done
替换文件内容
在文件中查找并替换文本是日常开发和管理中的核心操作。
方法 1:sed - 流编辑器 (最经典、最强大)
sed (Stream Editor) 是一个为处理文本流而设计的命令行工具,它可以读取文件、执行指定的操作(如替换),然后输出结果。
基本语法:
sed 's/搜索文本/替换文本/g' 文件名
s是 substitute。g是 global,表示替换文件中每一行的所有匹配项,如果没有g,则只替换每行的第一个匹配项。- 默认情况下,
sed只是将结果输出到标准输出(屏幕),并不会修改原文件。
示例:
-
查看替换结果,不修改原文件
# 将 file.txt 中的 "hello" 替换为 "world" 并显示在屏幕上 sed 's/hello/world/g' file.txt
-
直接在原文件上修改 (危险!) 要直接修改原文件,可以使用
-i(in-place) 选项。强烈建议在-i后面加一个备份后缀,以防万一。# 推荐:先创建一个 .bak 备份文件,然后进行替换 sed -i.bak 's/hello/world/g' file.txt # 执行后,会生成 file.txt.bak 备份文件,file.txt 被直接修改。 # 不推荐:直接修改,没有备份 sed -i 's/hello/world/g' file.txt
-
替换时忽略大小写 使用
I标志。sed -i 's/hello/World/gI' file.txt # 这会把 "hello", "Hello", "HELLO" 等都替换为 "World"
-
替换特定行中的内容 可以在
s前面加上行号。# 只替换第 5 行的内容 sed -i '5s/hello/World/g' file.txt
方法 2:vim 或 nano - 交互式文本编辑器
如果你只想修改一个或几个文件,使用文本编辑器是最直观、最安全的方式。
使用 vim:
- 打开文件:
vim filename.txt - 进入普通模式 (按
Esc键确保在此模式)。 - 输入替换命令:
- 替换全文:
%s/old_text/new_text/g- 表示整个文件范围。
s是 substitute。- 是分隔符。
g是 global。
- 替换当前行:
s/old_text/new_text/g - 替换从第10行到第20行:
10,20s/old_text/new_text/g
- 替换全文:
- 按回车执行。
- 输入
wq并回车,保存并退出。
使用 nano:
- 打开文件:
nano filename.txt - 按
Ctrl + \调出替换菜单。 - 输入要搜索的文本
old_text,回车。 - 输入要替换成的文本
new_text,回车。 nano会询问:Replace this one occurrence?(替换这次匹配?) -> 按YReplace all remaining occurrences?(替换所有剩余匹配?) -> 按Y
- 按
Ctrl + X退出,根据提示保存文件。
在命令行中替换历史命令
当你输入了一个很长的命令,但发现其中有个单词写错了,可以使用 fc 或 ^ 快速修正并重新执行。
方法 1:使用 fc 命令
fc (fix command) 会打开你指定的历史命令,让你用编辑器修改后执行。
# 重新编辑并执行上一个命令 fc # 重新编辑并执行倒数第3个命令 fc -3
方法 2:使用 ^ 字符 (最快)
这是 Bash 内置的快捷方式,非常高效。
语法:
^旧词^新词^
示例:
假设你错误地输入了 ls -l /var/log,但想看 /var/log/nginx 的内容。
# 错误命令 ls -l /var/log # 使用 ^ 快速修正 ^log^nginx^ # 系统会自动执行修正后的命令: ls -l /var/log/nginx
总结与推荐
| 场景 | 推荐命令 | 优点 | 缺点 |
|---|---|---|---|
| 批量重命名文件 | rename 's/old/new/' * |
功能强大,支持正则,一行搞定 | 语法需要学习,有两个不同版本 |
| 替换文件内容 | sed -i.bak 's/old/new/g' file |
非常适合脚本自动化,处理速度快 | 语法复杂,直接修改文件有风险 |
| 交互式修改文件 | vim / nano |
直观、安全,适合手动编辑 | 不适合自动化脚本 |
| 修正历史命令 | ^old^new^ |
极其快速,一行搞定 | 仅用于修正上一个命令 |
建议:
- 重命名文件:花5分钟搞懂
rename的 Perl 语法,它会让你事半功倍。 - 替换文件内容:
sed是你的主力工具,务必记住-i.bak的用法,养成好习惯。 - 不确定时:先用
sed不带-i的方式查看结果,确认无误后再加上-i进行修改。
