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

如何按ls命令输出顺序批量修改gbk文件的region编号?

多目录GBK文件批量按ls输出顺序重命名方案

前置注意

操作前请先备份所有目标文件,或者先将下文的mv命令替换为echo mv,预览重命名结果确认符合预期后再执行实际重命名操作。

方案1:Bash原生实现(兼容性最高,无需额外安装工具)

单目录下执行

count=1
# ls -v 采用自然排序,和你直接执行ls看到的输出顺序完全一致
for file in $(ls -v *.gbk); do
  newname=$(echo "$file" | sed "s/\.region[0-9]\+/.region$(printf "%03d" $count)/")
  # 文件名无变化时不执行重命名
  [ "$file" != "$newname" ] && mv -- "$file" "$newname"
  ((count++))
done

多目录递归执行(每个目录单独从001开始计数)

# 递归扫描所有包含.gbk文件的目录,逐个目录处理
find . -type f -name "*.gbk" -exec dirname {} \; | sort -u | while read dir; do
  echo "正在处理目录:$dir"
  count=1
  # 进入对应目录执行重命名,避免路径处理问题
  (
    cd "$dir" || exit
    for file in $(ls -v *.gbk); do
      newname=$(echo "$file" | sed "s/\.region[0-9]\+/.region$(printf "%03d" $count)/")
      [ "$file" != "$newname" ] && mv -- "$file" "$newname"
      ((count++))
    done
  )
done

如果需要所有目录的文件全局统一递增计数,只需要将count=1这行移到find命令之前即可。

方案2:Perl版rename实现(更简洁)

如果你的系统安装了Perl版rename(部分发行版默认自带,包名通常为prename/perl-rename),单目录下可以用更短的命令实现:

count=1; rename 's/\.region\d+/sprintf(".region%03d", $count++)/e' $(ls -v *.gbk)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:48:03