Alocar o espaço para o arquivo de saída primeiro pode melhorar a velocidade geral, pois o sistema não precisará atualizar a alocação para cada gravação.
Por exemplo, se no 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
Outro benefício é que, se não houver espaço livre suficiente, a cópia não será tentada.
Se ativado btrfs
, você poderá copy --reflink=always
o primeiro arquivo (que não implica cópia de dados e, portanto, seria quase instantâneo) e anexar o restante. Se houver 10000 arquivos, isso provavelmente não fará muita diferença, a menos que o primeiro arquivo seja muito grande.
Existe uma API para generalizar isso para copiar novamente todos os arquivos (o BTRFS_IOC_CLONE_RANGE
ioctl
), mas não consegui encontrar nenhum utilitário que exponha essa API; portanto, você deve fazê-lo em C ( python
ou em outros idiomas, desde que possam chamar ioctl
s arbitrários ) .
Se os arquivos de origem forem esparsos ou tiverem grandes seqüências de caracteres NUL, você poderá criar um arquivo de saída esparso (economizando tempo e espaço em disco) com (nos sistemas GNU):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
find
não classifica os arquivos da mesma forma que um shell glob.