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>,但对于一般变量,即使不是严格必要,也最好使用它们,而不是在必要时不使用它们。