当前位置:首页 > 问答 > 正文

文件管理|批量操作|CentOS系统下如何递归批量重命名文件

CentOS系统下如何递归批量重命名文件?一个运维人的高效技巧

场景引入

凌晨两点,服务器监控突然报警——某业务日志目录爆满,急需清理旧日志文件,你打开终端一看,几百个形如service_log_20230101.txt的文件散落在多级子目录中,需要统一改成archive_20230101.log,手动一个个改?怕是天亮了都搞不定,别慌,掌握下面这些命令,分分钟搞定递归批量重命名!


准备工作

  1. 备份!备份!备份!
    执行任何批量操作前,先压缩原始目录以防翻车:

    tar -czvf backup_logs.tar.gz /path/to/logs
  2. 安装必备工具
    CentOS默认已带findrename,但建议确认版本(GNU版本功能更全):

    rename --version  # 非GNU版本需安装:sudo yum install prename

实战方法

方法1:find + rename(推荐)

目标:将所有子目录中的.txt后缀改为.log,并在文件名前添加archive_前缀

文件管理|批量操作|CentOS系统下如何递归批量重命名文件

find /path/to/logs -type f -name "*.txt" -exec rename 's/(.*)\/(.*)\.txt$/$1\/archive_$2.log/' {} \;
  • 分解说明:
    • find /path/to/logs:从指定目录开始递归查找
    • -type f -name "*.txt":只找普通文件且后缀为.txt
    • rename 's/原模式/新模式/':用正则表达式替换
    • (.*)\/(.*)\.txt$:匹配“路径/文件名.txt”
    • $1\/archive_$2.log:保留路径($1),添加前缀并修改后缀

方法2:find + mv(兼容性更强)

目标:将文件名中的2023替换为2025

find /path/to/logs -type f -name "*2023*" | while read file; do
    newfile=$(echo "$file" | sed 's/2023/2025/g')
    mv "$file" "$newfile"
done

方法3:bash循环(适合简单操作)

目标:给所有.conf文件添加.bak后缀

for f in $(find /etc -type f -name "*.conf"); do
    mv "$f" "${f}.bak"
done

避坑指南

  1. 空格文件名处理
    遇到含空格的文件名时,用find -print0xargs -0组合:

    find /path -type f -print0 | xargs -0 rename 's/old/new/'
  2. 权限问题
    若提示权限不足,可结合sudo或先检查目录权限:

    文件管理|批量操作|CentOS系统下如何递归批量重命名文件

    find /path -type d -exec ls -ld {} \;
  3. 测试先行
    -n参数模拟执行,确认无误后再真实操作:

    rename -n 's/pattern/replace/' *.files

扩展技巧

  • 按时间批量重命名:将修改时间超过30天的日志文件标记为过期

    find /var/log -type f -mtime +30 -exec rename 's/(.*)/$1.expired/' {} \;
  • 大小写转换:将所有.JPG改为.jpg

    rename 'y/A-Z/a-z/' *.JPG

掌握这些命令后,下次再遇到“十万个文件要改名”的需求时,你大可以淡定地泡杯咖啡,敲几行命令,深藏功与名,高效运维的核心不是手速,而是知道如何让机器替你干活!

文件管理|批量操作|CentOS系统下如何递归批量重命名文件

(本文基于CentOS 7/8及主流GNU工具版本验证,2025年8月更新)

发表评论