使用shell将图像重命名为有序序列
我有一堆文件夹,其中包含按顺序排列但不按顺序排列的图像,如下所示: /root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg使用shell将图像重命名为有序序列,shell,Shell,我有一堆文件夹,其中包含按顺序排列但不按顺序排列的图像,如下所示: /root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg let i=0 ls *.jpg | while read file; do mv $file prefix_$(printf "%02d" $i).jpg
let i=0
ls *.jpg | while read file; do
mv $file prefix_$(printf "%02d" $i).jpg
let i++
done
/根
/f1
img21.jpg
img24.jpg
img26.jpg
img27.jpg
/f2
img06.jpg
img14.jpg
img36.jpg
img57.jpg
我想让它们看起来像这样,有文件夹标题,也有顺序排列的所有图像:
/root
/f1
f1_01.jpg
f1_02.jpg
f1_03.jpg
f1_04.jpg
/f2
f2_01.jpg
f2_02.jpg
f2_03.jpg
f2_04.jpg
/根
/f1
f1_01.jpg
f1_02.jpg
f1_03.jpg
f1_04.jpg
/f2
f2_01.jpg
f2_02.jpg
f2_03.jpg
f2_04.jpg
我不知道如何使用shell脚本来实现这一点
提前谢谢 在目录中,
ls
将按词法顺序为您提供文件,从而获得正确的排序。所以你可以这样做:
/root
/f1
img21.jpg
img24.jpg
img26.jpg
img27.jpg
/f2
img06.jpg
img14.jpg
img36.jpg
img57.jpg
let i=0
ls *.jpg | while read file; do
mv $file prefix_$(printf "%02d" $i).jpg
let i++
done
这将获取所有*.jpg
文件,并以前缀\u 00.jpg
,前缀\u 01.jpg
等开头重命名它们
这显然只适用于一个目录,但希望通过一点工作,您可以使用它来构建一些可以做您想要做的事情。在一个目录中,
ls
将按词法顺序为您提供文件,从而获得正确的排序。所以你可以这样做:
/root
/f1
img21.jpg
img24.jpg
img26.jpg
img27.jpg
/f2
img06.jpg
img14.jpg
img36.jpg
img57.jpg
let i=0
ls *.jpg | while read file; do
mv $file prefix_$(printf "%02d" $i).jpg
let i++
done
这将获取所有*.jpg
文件,并以前缀\u 00.jpg
,前缀\u 01.jpg
等开头重命名它们
这显然只适用于一个目录,但希望通过一点工作,您可以使用它来构建一些您想要的东西。使用
for
循环来迭代目录,使用另一个for
循环来迭代文件。为每个文件维护一个递增1的计数器
没有直接方便的方法用前导零填充数字。您可以调用printf
,但这有点慢。一个有用的快速技巧是从101开始计数(如果你想要两位数的数字,那么从1000开始,如果你想要三位数的数字,等等),然后去掉前面的1
cd /root
for d in */; do
i=100
for f in "$d/"*; do
mv -- "$f" "$d/${d%/}_${i#1}.${f##*.}"
i=$(($i+1))
done
done
${d%/}
在$d
结尾处剥离/
,${i#1}
在$i
和${f#*.}
开头处剥离$f
中除最后一个/code>之外的所有内容。这些构造在shell手册中有关参数扩展的部分中有文档记录
请注意,此脚本假定目标文件名不会与现有文件名冲突。如果您有一个名为img
的目录,某些文件将被覆盖。如果这可能是一个问题,最简单的方法是首先将所有文件移到另一个目录,然后在重命名它们时将它们移回原始目录。使用for
循环迭代目录,使用另一个for
循环迭代文件。为每个文件维护一个递增1的计数器
没有直接方便的方法用前导零填充数字。您可以调用printf
,但这有点慢。一个有用的快速技巧是从101开始计数(如果你想要两位数的数字,那么从1000开始,如果你想要三位数的数字,等等),然后去掉前面的1
cd /root
for d in */; do
i=100
for f in "$d/"*; do
mv -- "$f" "$d/${d%/}_${i#1}.${f##*.}"
i=$(($i+1))
done
done
${d%/}
在$d
结尾处剥离/
,${i#1}
在$i
和${f#*.}
开头处剥离$f
中除最后一个/code>之外的所有内容。这些构造在shell手册中有关参数扩展的部分中有文档记录
请注意,此脚本假定目标文件名不会与现有文件名冲突。如果您有一个名为img
的目录,某些文件将被覆盖。如果这可能是一个问题,最简单的方法是首先将所有文件移到另一个目录,然后在重命名它们时将它们移回原始目录。在这里调用ls
没有意义<读取文件时代码>ls*.jpg |
是在*.jpg中为文件编写的一种复杂且不完整的方法代码>。看,我不确定它是复杂的还是坏的。当然,这是不同的,但它将导致正确的行为,特别是对于OP示例输入<读取文件时代码>ls*.jpg |
是在*.jpg中为文件编写的一种复杂且不完整的方法代码>。看,我不确定它是复杂的还是坏的。当然,这是不同的,但它将导致正确的行为,特别是对于OP示例输入。