Lassen Sie xargs die Berechnung für Sie erledigen.
printf '%s\0' files/* | xargs -0 mv -t new_files_dir
Ihre Frage scheint davon auszugehen, dass es eine tatsächliche "Grenze der Anzahl der Argumente" gibt, während es sich tatsächlich um eine Kombination aus zwei Grenzen handelt:
-
die Summe der Stringlängen der Kommandozeilenargumente und Umgebungsvariablen einschließlich ihrer abschließenden NUL-Bytes.
-
die maximale Zeichenfolgenlänge eines einzelnen Befehlszeilenarguments.
Beispielsweise können Sie möglicherweise einen Befehl mit 200.000 Einbuchstaben-Argumenten aufrufen, mit 100.000 Zweibuchstaben-Argumenten, aber nicht mit einem einzigen Argument von mehr als 128 KB.
Angenommen xargs
von GNU Coreutils, xargs --show-limits </dev/null
wird zeigen, was diese Limits auf Ihrem System sind.
Auf jedem System xargs
wird nicht nutzen Sie die maximalen Grenzen Ihres Systems beim Erstellen von Befehlszeilen, wählen Sie aber etwas Vernünftiges (es würde überhaupt keinen Sinn machen, das System auf diese Weise zu belasten).
Wenn es wirklich darauf ankommt, könnten Sie Ihren eigenen batch-move
schreiben Programm in C, das z.B. die Dateiliste als Standardeingabe und übernimmt das Verschieben mit den entsprechenden Unix-Systemaufrufen.
Wenn nicht, ist das "Grenzen herausfinden und daran arbeiten" genau was xargs(1)
(GNU-Version unter Linux, hier) tut es. Ich bezweifle sehr, dass du viel schneller wirst.