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=always
die 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 ( python
oder in einer anderen Sprache, vorausgesetzt, sie können beliebige ioctl
s 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
find
sortiert Dateien nicht wie ein Shell-Glob.