当文件名具有非数字前缀时,按数字对文件名进行排序

当文件名具有非数字前缀时,按数字对文件名进行排序

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

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

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

答案1

您可以尝试使用例如 v的(版本)选项对文件进行排序。或者您可以使用数字排序作为分隔符: 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

答案2

您确定需要先对它们进行排序吗?

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 

如果您的 printf 实现不支持上述语法,请使用printf "%0.$(( m - 1 ))d" "${f#?}".

满意后去除回声。

答案3

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

你可以像这样使用它:

sort -V
sort --version-sort

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

sort -knV

答案4

您需要重命名,而有类似的工具也可以为您服务:

touch x1 x2 x10 x11 x101 
ls ; rename 's/x/x0/' x[0-9] 

x1 x10 x101 x11 x2

ls ; rename 's/x/x0/' x[0-9][0-9] 

x01 x02 x10 x101 x11

ls

x001 x002 x010 x011 x101

'rename' 是某些 perl 软件包的一部分,如果您需要安装它,至少可用于 Linux。

没有重命名,有一个类似的带循环的解决方案:

rm * 
touch x1 x2 x10 x11 x101
for f in  x[0-9] ; do mv $f ${f/x/x0}; done 
for f in  x[0-9][0-9] ; do mv $f ${f/x/x0}; done ; ls 

x001 x002 x010 x011 x101

相关内容