我想抓取目录中的每 5 个图像并将它们合并到一个新文件中,每个 5 个图像组具有唯一的文件名。
find *.jpg | xargs -n 5 -i convert {} -append {#}.png
这确实很接近,但 {#} 不输出当前行数。这对于 xargs 来说是可能的吗?
答案1
如果文件名不包含空格:
试运行:
find *.jpg | xargs -n 5 | awk '{OFS=" ";}{print "convert",$1,$2,$3,$4,$5,"-append",NR".png\n";}'
如果一切看起来都正常,请附加| sh
.
答案2
和zsh
:
set -- ./**/*.jpg(N.)
n=0
while (($# >= 5)) {
convert $@[1,5] -append $((++n)).png
shift 5
}
该文件应该适用于文件名中的任何字符,并且文件列表已排序。隐藏文件和目录将被忽略。
答案3
很高兴你能做到这一点parallel
。如果您仍然想使用 xargs,可以echo
向 xargs 命令添加 an 来打印命令,然后使用 awk 对输出进行后处理,以用合适的计数文件名替换最后一个单词(使用前导 0 以便于列出):
find . -name '*.jpg' | xargs -n 5 -i echo convert {} -append {#}.png |
awk '{ $NF = sprintf("%04d.png", i); i++; print }' |
bash
(你很幸运,我的 xargs 不允许我混合 -i 和 -n)。如果文件名中有空格,这将不起作用。我使用的find . -name
情况是你的文件太多并且*.jpg
太大而无法扩展。 (-maxdepth 1
如果您不想进入子目录,请添加)。
所以也许在 awk 中完成这一切更简单:
find . -maxdepth 1 -name '*.jpg' |
awk '{ files = files " " $1 }
NR%5 == 0 { printf("convert %s -append %04d.png\n",files,i); i++; files="" }
END { if(files!="")printf("convert %s -append %04d.png\n",files,i) } ' |
bash
该END
部分处理末尾文件不是 5 的倍数的情况。