Solche Fragen sind immer ein willkommener Anlass das eigene Wissen aufzufrischen...
Stimmt! :-)
xargs weiss also wie lang die Befehlszeile auf einem System sein darf. Man übergibt das auszuführende Kommando sowie möglicherweise ein paar "initial arguments" und dann füllt xargs die Befehlszeile bis zum Anschlag mit Werten vom Standard Input, und zwar so oft bis alles abgearbeitet ist.
Genau. Das hängt ganz vom System ab, ob es da eine globale Einschränkung gibt, oder ob xargs sich selber da auf einen sinnvollen Wert (64k anymore?) beschränkt. Wie das konkret aussieht, kann ich dir auch nicht sagen.
Damit ist xargs aber für diesen konkreten Einsatzfall (mv) trotzdem nicht zu gebrauchen, da zusätzliche Parameter nur vor den Dateinamen kommen können.
Ja, das stimmt. Grundsätzlich kann xargs auch mit Platzhaltern wie das {} bei "find -exec" arbeiten, allerdings sehe ich auch gerade in der Doku, dass dann immer nur ein Parameter auf einmal abgearbeitet wird.
Man könnte jetzt natürlich ein Einzeiler-Zwischenskript aufsetzen mit "mv $* /<zielverzeichnis>" und dieses von xargs aufrufen lassen. Dabei hat man aber das Problem dass man nicht genau weiss wieviel Platz einem in der Befehlszeile noch bleibt. Wenn xargs sie wirklich voll macht und für das Zielverzeichnis kein Platz bleibt dann knallt es trotzdem...
Ja, da könnte man noch einiges an Gehirnschmalz reinstecken (du kannst z.B. xargs die maximale Länge mitgeben und so Platz schaffen oder in dem Script nochmal xargs aufrufen), aber das macht wohl nur Sinn, wenn man wirklich Performance-Probleme hat. Für einmalige Aktionen lohnt das den Aufwand nicht, außer man verbucht das unter "Weiterbildung". ;-)