Przydzielenie najpierw miejsca na plik wyjściowy może poprawić ogólną szybkość, ponieważ system nie będzie musiał aktualizować przydziału dla każdego zapisu.
Na przykład, jeśli w systemie 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
Kolejną korzyścią jest to, że jeśli nie ma wystarczającej ilości wolnego miejsca, kopia nie zostanie podjęta.
Jeśli jest włączony btrfs
, możesz copy --reflink=always
pobrać pierwszy plik (co oznacza brak kopiowania danych i dlatego byłby prawie natychmiastowy), a resztę dołączyć. Jeśli jest 10000 plików, prawdopodobnie nie zrobi to dużej różnicy, chyba że pierwszy plik jest bardzo duży.
Istnieje interfejs API do uogólnienia tego, aby ponownie skopiować wszystkie pliki ( BTRFS_IOC_CLONE_RANGE
ioctl
), ale nie mogłem znaleźć żadnego narzędzia udostępniającego ten interfejs API, więc musiałbyś to zrobić w C ( python
lub w innych językach, pod warunkiem, że mogą wywoływać dowolne ioctl
) .
Jeśli pliki źródłowe są rzadkie lub mają duże ciągi znaków NUL, możesz utworzyć rzadki plik wyjściowy (oszczędzając czas i miejsce na dysku) za pomocą (w systemach GNU):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
find
nie sortuje plików tak samo jak glob powłoki.