Es gibt eine maximale Begrenzung für die Länge einer Argumentliste für Systembefehle. Diese Begrenzung ist distro-spezifisch und basiert auf dem Wert, zu MAX_ARG_PAGES
dem der Kernel kompiliert wurde. Sie kann nicht geändert werden, ohne den Kernel neu zu kompilieren.
Aufgrund der Art und Weise, wie Globbing von der Shell verarbeitet wird, wirkt sich dies auf die meisten Systembefehle aus, wenn Sie dasselbe Argument ("* .jpg") verwenden. Da der Glob zuerst von der Shell verarbeitet und dann an den Befehl gesendet wird, lautet der Befehl:
cp -uf *.jpg /targetdir/
ist im Wesentlichen das gleiche für die Shell, als ob Sie geschrieben haben:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Wenn Sie mit vielen JPEGs zu tun haben, kann dies sehr schnell unüberschaubar werden. Abhängig von Ihrer Namenskonvention und der Anzahl der Dateien, die Sie tatsächlich verarbeiten müssen, können Sie den Befehl cp jeweils für eine andere Teilmenge des Verzeichnisses ausführen :
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Dies könnte funktionieren, aber wie effektiv es wäre, hängt davon ab, wie gut Sie Ihre Dateiliste in praktische globbable Blöcke aufteilen können.
Globbable. Ich mag dieses Wort.
Einige Befehle, wie find und xargs , können große Dateilisten verarbeiten, ohne schmerzhaft große Argumentlisten zu erstellen.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
Das Argument -exec führt den Rest der Befehlszeile einmal für jede von find gefundene Datei aus und ersetzt das {} durch jeden gefundenen Dateinamen. Da der Befehl cp jeweils nur für eine Datei ausgeführt wird, ist das Argumentlistenlimit kein Problem.
Dies kann langsam sein, da jede Datei einzeln verarbeitet werden muss. Die Verwendung von xargs könnte eine effizientere Lösung bieten:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs kann die vollständige Dateiliste von find in Argumentlisten mit überschaubaren Größen aufteilen und cp für jede dieser Unterlisten ausführen .
Natürlich gibt es auch die Möglichkeit, den Kernel einfach neu zu kompilieren und einen größeren Wert für festzulegen MAX_ARG_PAGES
. Das Neukompilieren eines Kernels ist jedoch mehr Arbeit, als ich in dieser Antwort erklären möchte.