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

时间:2012-08-16 00:33:54

标签: shell

我有一堆文件夹包含有序的图像,但不是这样的顺序:

/root
  /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

我不确定如何使用shell脚本执行此操作。

提前致谢!

2 个答案:

答案 0 :(得分:2)

在目录中,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开始重命名,等等。

这显然只适用于单个目录,但希望通过一些工作,你可以使用它来构建一些能够做你想做的事情。

答案 1 :(得分:2)

使用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.开始除去最后一个img之外的所有内容。这些结构在shell手册中有关参数扩展的部分中有说明。

请注意,此脚本假定目标文件名不会与现有文件的名称冲突。如果您有一个名为{{1}}的目录,则会覆盖某些文件。如果这可能是一个问题,最简单的方法是首先将所有文件移动到另一个目录,然后在重命名时将它们移回原始目录。