ImageMagick - 通过多个 for 循环递增文件名

ImageMagick - 通过多个 for 循环递增文件名

这是一个关于使用一系列“for”循环重命名/递增文件名的 Bash 问题。我不明白这种行为...

使用 ImageMagickconvert命令

如果我用 3 个源文件来执行此操作:

$ convert *.miff dir/%d.miff
$ convert *.miff dir1/%d.miff

我得到了预期的行为,dir并且dir1都包含文件0.miff 1.miff 2.miff- 这是所需的行为。然而,convert将所有源图像读入内存并吸收资源(尝试使用 30 - 40 个大图像文件),不一定按照严格的文件顺序。

这样比较好,逐个文件,严格按顺序,满足最终处理要求,一次一个文件

$ for var in `ls -v *.miff`; do convert $var dir/%d.miff; done
$ for var in `ls -v *.miff`; do convert $var dir1/%d.miff; done

但是,我进去了0.miff 1.miff 2.miffdir进去3.miff 4.miff 5.miffdir1

我尝试为每个循环分配不同的变量*.miff$var并使用%d.miff诸如$((x++)).miff.没有变化 - 继续向上递增,而不是在每个“for”循环中重置为“0”。

我已经搜索了一个有意义的答案,但怀疑这是嵌入在 bash 中的行为,并且似乎与变量的使用有关$var

编辑#1

为了避免让读者感到不知所措,问题被简化了,但有 4 个循环,每个循环执行不同的操作,最终重新组合在 4 个目录中创建的图像;修改后的脚本如下,根据 Jesse_p 的回答:

x=(0)    
for i in `ls -v *.miff`; do 
  convert "$i" -depth $depth -roll +0+0 -sample 50% B/"$((x++)).miff"
done

x=(0)    
for i in `ls -v *.miff`; do 
  convert "$i" -depth $depth -roll +0+1 -sample 50% G/"$((x++)).miff"
done

x=(0)    
for i in `ls -v *.miff`; do
  convert "$i" -depth $depth -roll +1+0 -sample 50% g/"$((x++)).miff"
done    

x=(0)    
for i in `ls -v *.miff`; do 
  convert "$i" -depth $depth -roll +1+1 -sample 50% R/"$((x++)).miff"
done

for ((R=0,G=0,g=0,B=0;R<=101;R+=1,G+=1,g+=1,B+=1)); do
  convert R/$R.miff G/$G.miff B/$B.miff depth $depth \
     -colorspace sRGB -combine "$((x++))_$name.tiff"    
done

答案1

根据 ImageMagick文档您可以用来-scene设置起始序列号。 (V6.2及以上版本):

话虽这么说,正如 ilkkachu 指出的那样,并且我的测试已经证实,您的循环只会不断覆盖名为的文件,0.miff而根本不会增加。您可以使用以下内容创建递增文件:

x=0
for file in *.miff; do convert "$file" "dir/$((x++)).miff"; done
x=0
for file in *.miff; do convert "$file" "dir1/$((x++)).miff"; done

x=0将 的值赋给0名为 的变量x

$((x++))将增加x 当前操作。因此,在第一次运行时,它将是 0.miff,然后是 1.miff,等等。我们x=0在循环之间再次调用,以确保我们在下一次运行时从 0 开始。

请注意,glob 文件 (*.miff) 比解析ls

相关内容