这是一个关于使用一系列“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.miff
又dir
进去3.miff 4.miff 5.miff
了dir1
我尝试为每个循环分配不同的变量*.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