Linux 批量将文件夹内文件重命名为补零顺序数字时结果异常
批量重命名file*文件为补零编号时顺序错误问题
问题描述
期望将文件夹内的file1、file2……file100批量重命名为001、002……100格式的补零顺序编号,运行以下脚本后编号不符合预期,例如file1被重命名为051:
string_leng=`(ls -l | grep ^- | wc -l) | wc -L` echo $string_leng find . | grep 'file' | nl -nrz -w$string_leng -v1 | while read n f; do mv "$f" "$n"; done
错误原因
find .输出的文件列表默认不按文件名的数字顺序排序,采用的是文件系统的inode存储顺序,导致文件排序错乱- 第一行统计的是当前目录所有普通文件的数量,不是目标
file*文件的数量,目录内存在其他文件时补零长度会计算错误 find .默认会输出当前目录.本身,未做过滤会干扰匹配结果
修正后可用脚本
# 统计目标文件总数,计算补零位数 file_count=$(find . -maxdepth 1 -type f -name "file*" | wc -l) pad_length=${#file_count} # 按自然顺序排序后批量重命名 find . -maxdepth 1 -type f -name "file*" | sort -V | nl -nrz -w"$pad_length" -v1 | while read -r n f; do mv -- "$f" "$n"; done
参数说明
-maxdepth 1:限制仅处理当前目录,不会递归匹配子目录内的文件-type f:仅匹配普通文件,排除目录、软链接等非目标文件sort -V:按版本号自然排序,保证file1 < file2 < ... < file100的排序逻辑符合预期mv --:避免文件名以-开头时命令解析错误
内容的提问来源于stack exchange,提问作者Chung
相关产品推荐
相关产品推荐

