-X
é distribuído uniformemente quando atinge o EOF.
Então, no seu caso, ele preenche o buffer para uma linha de comando completa (nomes 5039) e inicia isso. Em seguida, ele lê outros 800 nomes até atingir o EOF. Isso não é suficiente para iniciar um trabalho completo, então eles são distribuídos entre os jobslots.
Veja a página 37 link
Isso é feito dessa forma para evitar a necessidade de ler todos os trabalhos com antecedência, pois todos os trabalhos podem não estar disponíveis (pense em tail -f file.names | parallel ...
).
Pode ser uma idéia melhor se o GNU Parallel ler nomes suficientes para preencher todos os jobslots antes de iniciar o próximo trabalho no modo -X
, para que ele possa detectar o EOF anteriormente. Isso, no entanto, não foi implementado. Patch bem-vindo.
Uma solução alternativa é usar:
ls *.jpg |
parallel --round --pipe -N1 parallel -Xj1 count
Não é possível produzir após cada trabalho, mas pode fazer uma saída linebuffered:
ls *.jpg |
parallel --lb --round --pipe -N1 parallel --lb -Xj1 count
Se os nomes dos arquivos contiverem \ n:
printf '%sls *.jpg |
parallel --round --pipe -N1 parallel -Xj1 count
' *.jpg |
parallel --recend 'ls *.jpg |
parallel --lb --round --pipe -N1 parallel --lb -Xj1 count
' --round --lb --pipe -N1 parallel -0Xj1 count