You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux批量重命名:如何仅重命名带数字的文件,排除无数字文件

解决Linux下批量重命名带数字的文件(排除无数字的目标文件)

嘿,这个场景我太熟悉了!你需要精准匹配带数字后缀的websiteN.txt文件,完全排除website.txt,咱们可以用下面几种靠谱的方法搞定:

方法一:用Perl版rename命令(推荐)

Linux里的rename有两种常见版本,Perl版的支持正则表达式,特别适合这种精准匹配的需求。先给你测试命令(不会实际修改文件,放心试):

rename -n 's/website(\d+)\.txt/new_name$1.txt/' website*.txt

这里的正则逻辑很关键:

  • website(\d+)\.txt:精准匹配以website开头,后面跟至少一个数字,最后以.txt结尾的文件
  • (\d+)是捕获组,会把文件名里的数字部分存起来,后面用$1就能直接引用这部分内容
  • 因为明确要求了数字的存在,所以website.txt会被直接跳过,不会出现在测试结果里

如果测试输出完全符合你的预期,去掉-n参数就能执行实际的重命名操作:

rename 's/website(\d+)\.txt/new_name$1.txt/' website*.txt

方法二:用Bash循环手动处理(兼容无Perl版rename的系统)

如果你的系统没有安装Perl版rename,用Bash循环加条件判断也能实现:

先跑测试(只输出操作,不修改文件)

for file in website*.txt; do
  if [[ $file =~ website[0-9]+\.txt ]]; then
    echo "准备重命名:$file → new_name${file#website}"
  fi
done

解释下这段逻辑:

  • [[ $file =~ website[0-9]+\.txt ]]:用正则判断当前文件名是否包含至少一个数字
  • ${file#website}是Bash的字符串截取语法,会去掉文件名开头的website部分,比如website1.txt会变成1.txt,拼接new_name后就是new_name1.txt

确认测试结果没问题后,把echo换成mv命令即可执行实际重命名:

for file in website*.txt; do
  if [[ $file =~ website[0-9]+\.txt ]]; then
    mv "$file" "new_name${file#website}"
  fi
done

为啥你之前的测试会把website.txt也包含进来?

大概率是你用的匹配规则太宽泛了——比如如果只是用website*.txt配合简单的字符串替换,没有明确限制“必须包含数字”,就会把不带数字的website.txt也误匹配进去。上面两种方法都通过正则明确要求了至少一个数字,所以能精准过滤掉不需要的文件。

内容的提问来源于stack exchange,提问作者Brett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:07:32