Das Zuweisen des Speicherplatzes für die Ausgabedatei als Erstes kann die Gesamtgeschwindigkeit verbessern, da das System die Zuordnung nicht bei jedem Schreibvorgang aktualisieren muss.
Zum Beispiel, wenn unter Linux:
size=$({ find . -maxdepth 1 -type f -name 'input_file*' -printf '%s+'; echo 0;} | bc)
fallocate -l "$size" out &&
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat 1<> out
Ein weiterer Vorteil ist, dass der Kopiervorgang nicht ausgeführt wird, wenn nicht genügend freier Speicherplatz vorhanden ist.
Wenn diese Option aktiviert ist btrfs, können Sie copy --reflink=alwaysdie erste Datei (die keine Datenkopie impliziert und daher fast augenblicklich ist) und den Rest anhängen. Wenn es 10000 Dateien gibt, wird das wahrscheinlich keinen großen Unterschied machen, es sei denn, die erste Datei ist sehr groß.
Es gibt eine API, um das zu verallgemeinern, um alle Dateien (die BTRFS_IOC_CLONE_RANGE ioctl) erneut zu kopieren , aber ich konnte kein Hilfsprogramm finden, das diese API verfügbar macht, also müssten Sie es in C ( pythonoder in einer anderen Sprache, vorausgesetzt, sie können beliebige ioctls aufrufen ) .
Wenn die Quelldateien spärlich sind oder große Sequenzen von NUL-Zeichen enthalten, können Sie mit (auf GNU-Systemen) eine spärliche Ausgabedatei erstellen (um Zeit und Speicherplatz zu sparen):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
findsortiert Dateien nicht wie ein Shell-Glob.