-X
verteilt sich gleichmäßig, wenn es auf EOF trifft.
In Ihrem Fall füllt es also den Puffer für eine vollständige Befehlszeile (5039 Namen) und startet diesen. Dann liest es weitere 800 Namen, bis es EOF erreicht. Das reicht nicht aus, um einen vollen Job zu beginnen, so dass diese auf die Jobslots verteilt werden.
Siehe Seite 37 https://zenodo.org/record/1146014
Auf diese Weise wird vermieden, dass alle Jobs vorab gelesen werden müssen, da möglicherweise nicht alle Jobs verfügbar sind (denken Sie tail -f file.names | parallel ...
).
Es ist möglicherweise eine bessere Idee, wenn GNU Parallel genug Namen gelesen hat, um alle Jobslots zu füllen, bevor der nächste Job im -X
Modus gestartet wird, sodass EOF früher erkannt werden kann . Dies wurde jedoch nicht implementiert. Patch willkommen.
Eine Problemumgehung ist zu verwenden:
ls *.jpg | parallel --round --pipe -N1 parallel -Xj1 count
Es kann nicht nach jedem Job ausgegeben werden, aber es kann eine Linebuffer-Ausgabe erfolgen:
ls *.jpg | parallel --lb --round --pipe -N1 parallel --lb -Xj1 count
Wenn die Dateinamen \ n enthalten:
printf '%s\0' *.jpg | parallel --recend '\0' --round --lb --pipe -N1 parallel -0Xj1 count