Linux 批量重命名技巧,如何高效去掉文件名中的特定字符串

XMSDN

在 Linux 环境下,我们经常会遇到需要批量处理文件名的情况,你可能下载了一堆文件,它们的命名格式是 image_v1.jpgimage_v2.jpgdocument_v1.pdf 等,而你只想保留核心文件名,去掉后面的版本号后缀(即去掉 _v1)。

手动一个个修改不仅耗时,而且容易出错,幸运的是,Linux 提供了多种强大的工具来实现这一需求,本文将介绍几种最常用且高效的方法,帮助你快速去掉文件名中的特定字符串。

使用 rename 命令(最推荐)

rename 命令是 Linux 中专门用于重命名文件的工具,在大多数现代发行版(如 Ubuntu, Debian, Arch Linux)中,默认安装的是基于 Perl 的 rename 版本,它的语法非常强大且直观。

Linux 批量重命名技巧,如何高效去掉文件名中的特定字符串

语法:

rename 's/要删除的字符串/替换后的字符串/' 文件名

示例: 假设当前目录下有 test_v1.txttest_v2.txt,你想去掉所有文件名中的 _v1

rename 's/_v1//' *.txt

执行后,文件将变为 test.txt

高级用法:去掉特定前缀或后缀 如果你只想去掉开头的字符串,可以使用 ^ 符号;只想去掉的字符串,可以使用 符号,这能避免误删文件名中间的字符。

去掉所有文件名开头的 backup_

rename 's/^backup_//' *

使用 mv 配合 sed(经典方法)

如果你使用的是 CentOS 或 RHEL 等系统,默认的 rename 可能是基于 util-linux 的,语法与 Perl 版本不同,或者你更喜欢使用 sed 流编辑器,mv 配合 sed 是一个非常通用的解决方案。

语法:

mv "原文件名" "$(echo "原文件名" | sed 's/要删除的字符串//')"

批量处理脚本: 为了批量处理当前目录下的所有文件,我们可以写一个简单的 for 循环:

for f in *; do
    # 将文件名中的 "_v1" 替换为空
    mv "$f" "$(echo "$f" | sed 's/_v1//')"
done

注意: 这种方法必须加引号 "$f",否则如果文件名包含空格,脚本会报错。

递归处理子目录(使用 find

如果你的文件散布在多个子目录中,renamemv 命令默认只处理当前目录,这时我们需要结合 find 命令来递归查找文件。

示例: 递归查找当前目录及其子目录下所有 .txt 文件,并去掉文件名中的 _old

find . -type f -name "*.txt" -exec rename 's/_old//' {} +

或者使用 sed 方式:

find . -type f -name "*.txt" -exec bash -c 'mv "$1" "${1//_old/}"' _ {} \;
💡 温馨提示

📌 阅读须知 Rules & Notice

本站坚持免费分享,致力于为大家提供实用、优质的内容与资源。

🔗欢迎大家收藏与转发,转载请保留本站链接,请勿私自去除版权信息。

📚所有外部整理资源,仅作学习交流使用,请勿用于各类商业用途。

🤝网络相聚本是缘分,希望大家文明交流,理性浏览。

🛠️若发现内容有误或涉及侵权,我们将第一时间处理整改。

💖 感谢每一位朋友的陪伴与支持

✨ 用心分享,一路同行 ✨

目录[+]