如何按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
相关产品推荐
相关产品推荐

