我有以下格式的文件: x1 x2 ... x10 x11 ... x101 ...
我想重命名这些文件,因此它们都具有相同的名称长度: x001 x002 ... x010 ...
我可以对没有非数字前缀(仅使用sort -n
后跟 a while read x;
)的文件执行此操作,但是当 sort 不在文件名的开头时,它无法识别数字值。
您可以尝试使用例如 的v
(version) 选项对文件进行排序。或者您可以使用数字排序作为分隔符: ls
ls -1v
x
ls | sort -n -t 'x' +1
但是您不必对文件进行排序以重命名它们。您可以只查看文件名的长度,并在必要时用零填充它。这是一个执行此操作的小脚本:
prefix=x
maxLength=4
for file in ${prefix}*
do
if [ ${#file} -lt $maxLength ]
then
newFile=$file
while [ ${#newFile} -lt $maxLength ]
do
newFile=${newFile/$prefix/${prefix}0}
done
mv $file $newFile
fi
done
Run Code Online (Sandbox Code Playgroud)
小智 5
您确定需要先对它们进行排序吗?
m=0
for f in x*; do
[ "${#f}" -gt "$m" ] &&
m=${#f}
done
for f in x*; do
echo mv -- "$f" "${f%${f#?}}$( printf '%0.*d' $(( m - 1 )) "${f#?}" )"
done
Run Code Online (Sandbox Code Playgroud)
如果您的 printf 实现不支持上述语法,请使用printf "%0.$(( m - 1 ))d" "${f#?}"
.
满意时删除回声。
只是为了详细说明 dogbane 的答案,sort
有一个版本排序选项。请注意,某些平台(例如busybox)没有此选项。
你可以像这样使用它:
sort -V
sort --version-sort
Run Code Online (Sandbox Code Playgroud)
或者对第 n 列进行版本排序:
sort -knV
Run Code Online (Sandbox Code Playgroud)