L'allocation de l'espace pour le fichier de sortie en premier peut améliorer la vitesse globale car le système n'aura pas à mettre à jour l'allocation pour chaque écriture.
Par exemple, si sous 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
Un autre avantage est que s'il n'y a pas assez d'espace libre, la copie ne sera pas tentée.
Si cette option est activée btrfs
, vous pouvez créer copy --reflink=always
le premier fichier (ce qui n'implique aucune copie de données et serait donc presque instantané) et ajouter le reste. S'il y a 10000 fichiers, cela ne fera probablement pas beaucoup de différence, sauf si le premier fichier est très volumineux.
Il y a une API pour généraliser cela pour recopier tous les fichiers (les BTRFS_IOC_CLONE_RANGE
ioctl
), mais je n'ai trouvé aucun utilitaire exposant cette API, vous devriez donc le faire en C ( python
ou dans d'autres langues à condition qu'ils puissent appeler des ioctl
s arbitraires ) .
Si les fichiers source sont clairsemés ou ont de grandes séquences de caractères NUL, vous pouvez créer un fichier de sortie clairsemé (gain de temps et d'espace disque) avec (sur les systèmes GNU):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
find
ne trie pas les fichiers de la même manière qu'un shell glob.