Bash 在shell脚本中重新排序文件

Bash 在shell脚本中重新排序文件,bash,shell,sh,Bash,Shell,Sh,在我的系统中,文件的格式如下 image0.jpg image1.jpg image2.jpg image3.jpg . . . . . image10.jpg image11.jpg 我可以使用下面的脚本来订购文件 for i in *.jpg; do new=$(printf "xome%04d.jpg" "$a") #04 pad to length of 4 mv -- "$i" "$new" let a=a+1 done

在我的系统中,文件的格式如下

image0.jpg
image1.jpg
image2.jpg
image3.jpg
  .
  .

  .
  .
  .
image10.jpg
image11.jpg
我可以使用下面的脚本来订购文件

for i in *.jpg; do
    new=$(printf "xome%04d.jpg" "$a") #04 pad to length of 4
        mv -- "$i" "$new"
        let a=a+1
done
但是会发生什么呢?它是按如下顺序获取文件的,比如
image0.jpg、image10.jpg、image1.jpg、image11.jpg、image2.jpg………

如何使用shell脚本获取序列请尝试以下操作:

for i in {1..11}; do
    printf -v newfile "xome%04d.jpg" "$i"
    [ -f "image${i}" ] && mv "image${i}.jpg" "$newfile"
done
-v
选项将
printf
结果存储在变量
newfile


[-f“image${i}”]
在尝试重命名之前测试文件是否存在。

如果文件已经命名为
imageN.jpg
,为什么不从文件名中提取数字并用0填充,而不是使用计数器?@Mark建议类似于
mv--“$i”“xome${i%image}”
您应该引用
“$newfile”
@tripleee可能是一个很好的做法,但在这种情况下,
$newfile
是由非空格字符串组成的。在这种特殊情况下,是的,但添加两个字符来解决更普遍的问题似乎是一个适中的代价。您可以忽略保证无空格和全局的扩展的报价,例如
$\code>,但对于一般变量,即使不是严格必要,也最好使用它们,而不是在必要时不使用它们。