我有一堆文件夹,其中包含按顺序排列但不按顺序
排列的图像,如下所示:/根 /f1 IMG21.jpg IMG24.jpg IMG26.jpg IMG27.jpg /f2 IMG06.jpg IMG14.jpg IMG36.jpg IMG57.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 脚本执行此操作。
提前感谢!
for
循环遍历目录,使用另一个for
循环遍历文件。维护一个计数器,每个文件递增 1。
没有直接方便的方法来用前导零填充数字。你可以打电话给printf
,但这有点慢。一个有用的快速技巧是从 101 开始计数(如果你想要两位数——如果你想要 3 位数字,则为 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}
条带1
在$i
开始时,${f##*.}
剥离$f
除最后一.
之后的所有内容。这些构造记录在 shell 手册中有关参数扩展的部分。
请注意,此脚本假定目标文件名不会与现有文件的名称冲突。如果你有一个名为 img
的目录,一些文件将被覆盖。如果这可能是一个问题,最简单的方法是先将所有文件移动到其他目录,然后在重命名它们时将它们移回原始目录。
在目录中,ls
将按词法顺序为您提供文件,从而获得正确的排序。 所以你可以做这样的事情:
let i=0
ls *.jpg | while read file; do
mv $file prefix_$(printf "%02d" $i).jpg
let i++
done
这将获取所有*.jpg
文件,并从 prefix_00.jpg
、 prefix_01.jpg
等开头重命名它们。
这显然仅适用于单个目录,但希望通过一些工作,您可以使用它来构建可以执行您想要的操作。