1

我有一堆文件夹,其中包含按顺序排列但不按顺序排列的图像,如下所示:

/根
  /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 脚本来做到这一点。

提前致谢!

4

2 回答 2

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依此类推。

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

于 2012-08-16T00:49:20.293 回答
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%/}strips /at the end $d, ${i#1}strips 1at the start $iand strips at the end, strips at the beginning and strips at the end, strips at the beginning and strips at the end, strips at the end and strips at the end, strips at the end and strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end, strips at the end 的 strips 和 strips at the start , 并${f##*.}$f除最后一个之外的所有内容中剥离.。这些构造记录在您的 shell 手册中的参数扩展部分中。

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

于 2012-08-16T01:09:45.513 回答