当文件名具有非数字前缀时按数字排序

Šim*_*óth 5 bash sort rename

我有以下格式的文件: x1 x2 ... x10 x11 ... x101 ...

我想重命名这些文件,因此它们都具有相同的名称长度: x001 x002 ... x010 ...

我可以对没有非数字前缀(仅使用sort -n后跟 a while read x;)的文件执行此操作,但是当 sort 不在文件名的开头时,它无法识别数字值。

dog*_*ane 6

您可以尝试使用例如 的v(version) 选项对文件进行排序。或者您可以使用数字排序作为分隔符: lsls -1vxls | 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#?}".

满意时删除回声。


Six*_*Six 5

只是为了详细说明 dogbane 的答案sort有一个版本排序选项。请注意,某些平台(例如busybox)没有此选项。

你可以像这样使用它:

sort -V
sort --version-sort
Run Code Online (Sandbox Code Playgroud)

或者对第 n 列进行版本排序:

sort -knV
Run Code Online (Sandbox Code Playgroud)