如何从 xargs 获取当前行数?

如何从 xargs 获取当前行数?

我想抓取目录中的每 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 的倍数的情况。

相关内容