使用 shell 将图像重命名为有序序列



我有一堆文件夹,其中包含按顺序排列但不按顺序

排列的图像,如下所示:
/根 /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.jpgprefix_01.jpg 等开头重命名它们。

这显然仅适用于单个目录,但希望通过一些工作,您可以使用它来构建可以执行您想要的操作。

最新更新