我有以下格式的文件:x1 x2 ... x10 x11 ... x101 ...
我想重命名这些文件,使它们都具有相同的名称长度:x001 x002 ... x010 ...
我可以对没有非数字前缀的文件执行此操作(只需使用sort -n
后跟while read x;
),但当数字值不在文件名开头时,排序无法识别数字值。
答案1
您可以尝试使用例如 v
的(版本)选项对文件进行排序。或者您可以使用数字排序作为分隔符: 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
答案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