Выделение пространства для выходного файла сначала может улучшить общую скорость, поскольку системе не придется обновлять выделение для каждой записи.
Например, если в 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
Еще одним преимуществом является то, что если не хватает свободного места, копия не будет предприниматься.
Если включено btrfs
, вы можете copy --reflink=always
первый файл (который подразумевает отсутствие копирования данных и, следовательно, будет почти мгновенным), и добавить остальные. Если есть 10000 файлов, это, вероятно, не будет иметь большого значения, если только первый файл не очень большой.
Существует обобщающий API для повторного копирования всех файлов ( BTRFS_IOC_CLONE_RANGE
ioctl
), но я не смог найти никакой утилиты, предоставляющей этот API, поэтому вам придется делать это на C ( python
или на других языках, если они могут вызывать произвольные ioctl
s). ,
Если исходные файлы редки или имеют большие последовательности символов NUL, вы можете создать разреженный выходной файл (экономя время и дисковое пространство) с помощью (в системах GNU):
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
find
не сортирует файлы так же, как глобус оболочки.