Se os nomes dos arquivos não contiverem espaços em branco:
Corrida a seco:
find *.jpg | xargs -n 5 | awk '{OFS=" ";}{print "convert",$1,$2,$3,$4,$5,"-append",NR".png\n";}'
Se tudo estiver correto, anexe | sh
.
Eu quero pegar cada 5 imagens em um diretório e juntá-las em um novo arquivo com um nome de arquivo exclusivo por 5 grupos de imagens.
find *.jpg | xargs -n 5 -i convert {} -append {#}.png
Isso está realmente próximo, mas o {#} não exibe a contagem de linhas atual. Isso é possível com xargs?
Se os nomes dos arquivos não contiverem espaços em branco:
Corrida a seco:
find *.jpg | xargs -n 5 | awk '{OFS=" ";}{print "convert",$1,$2,$3,$4,$5,"-append",NR".png\n";}'
Se tudo estiver correto, anexe | sh
.
com zsh
:
set -- ./**/*.jpg(N.)
n=0
while (($# >= 5)) {
convert $@[1,5] -append $((++n)).png
shift 5
}
Esse deve funcionar com todos os caracteres nos nomes dos arquivos, e a lista de arquivos é classificada. Arquivos e diretórios ocultos são ignorados.
Que bom que você pode fazer isso com parallel
. Se você ainda quiser usar xargs, você pode
adicione um echo
ao comando xargs para apenas
obter o comando impresso, em seguida, pós-processar a saída com awk para
substitua a última palavra por um nome de arquivo contado adequado (com os 0 iniciais para facilitar a listagem):
find . -name '*.jpg' | xargs -n 5 -i echo convert {} -append {#}.png |
awk '{ $NF = sprintf("%04d.png", i); i++; print }' |
bash
(Você tem sorte, meus xargs não me deixam misturar -i e -n). Isso não funcionará se você tiver espaços nos nomes de arquivos. Eu usei find . -name
no caso de você ter muitos arquivos e o *.jpg
é muito grande para expandir. (adicione -maxdepth 1
se você não quiser entrar em subdiretórios).
Então talvez seja mais simples fazer tudo no 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
A parte END
lida com casos em que não há um múltiplo de 5 arquivos no final.