Como obtenho a contagem de linha atual de xargs?

5

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?

    
por Jason 23.06.2015 / 06:44

3 respostas

2

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 .

    
por 23.06.2015 / 08:25
2

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.

    
por 23.06.2015 / 12:15
0

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.

    
por 23.06.2015 / 08:46