Mengalokasikan ruang untuk file output terlebih dahulu dapat meningkatkan kecepatan keseluruhan karena sistem tidak perlu memperbarui alokasi untuk setiap penulisan.
Misalnya, jika di 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
Manfaat lain adalah bahwa jika tidak ada cukup ruang kosong, salinan tidak akan dicoba.
Jika aktif btrfs
, Anda dapat copy --reflink=always
menggunakan file pertama (yang tidak mengandung salinan data dan karena itu akan hampir instan), dan menambahkan sisanya. Jika ada 10.000 file, itu mungkin tidak akan membuat banyak perbedaan meskipun kecuali file pertama sangat besar.
Ada API untuk menggeneralisasi itu untuk menyalin ulang semua file (the BTRFS_IOC_CLONE_RANGE
ioctl
), tapi saya tidak dapat menemukan utilitas yang mengekspos API itu, jadi Anda harus melakukannya dalam C (atau python
atau bahasa lain asalkan mereka dapat memanggil ioctl
s sewenang-wenang ) .
Jika file sumber jarang atau memiliki urutan besar karakter NUL, Anda bisa membuat file output jarang (menghemat waktu dan ruang disk) dengan (pada sistem GNU):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
find
tidak mengurutkan file sama dengan shell glob.