Asignar primero el espacio para el archivo de salida puede mejorar la velocidad general ya que el sistema no tendrá que actualizar la asignación para cada escritura.
Por ejemplo, si en 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
Otro beneficio es que si no hay suficiente espacio libre, la copia no se intentará.
Si está activado btrfs
, podría copy --reflink=always
el primer archivo (lo que implica que no hay copia de datos y, por lo tanto, sería casi instantáneo), y agregar el resto. Si hay 10000 archivos, eso probablemente no hará mucha diferencia, a menos que el primer archivo sea muy grande.
Hay una API para generalizar eso para volver a copiar todos los archivos (the BTRFS_IOC_CLONE_RANGE
ioctl
), pero no pude encontrar ninguna utilidad que exponga esa API, por lo que tendrías que hacerlo en C ( python
u otros lenguajes siempre que puedan llamar ioctl
s arbitrarios ) .
Si los archivos de origen son escasos o tienen secuencias grandes de caracteres NUL, puede crear un archivo de salida disperso (ahorrando tiempo y espacio en disco) con (en sistemas GNU):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
find
no clasifica los archivos de la misma manera que un shell glob.