Для рекурсивного копирования каталога использование tar
для упаковки каталога и последующей передачи вывода в другой каталог tar
для распаковки, по-видимому, намного быстрее, чем использование cp -r
(или cp -a
).
Почему так? И почему нельзя cp
сделать быстрее, сделав то же самое под капотом?
Редактировать: Я заметил эту разницу, когда пытался скопировать огромную структуру каталогов, содержащую десятки тысяч файлов и папок, глубоко вложенных, но в целом всего около 50 МБ. Не уверен, что это имеет значение.
решение1
Cp
выполняет открытие-чтение-закрытие-открытие-запись-закрытие в цикле по всем файлам. Таким образом, чтение из одного места и запись в другое происходят полностью чередующимися. Tar|tar
выполняет чтение и запись в отдельных процессах, и, кроме того, tar
использует несколько потоков для чтения (и записи) нескольких файлов «одновременно», эффективно позволяя контроллеру диска извлекать, буферизировать и сохранять множество блоков данных одновременно. В целом, tar
позволяет каждому компоненту работать эффективно, при этом cp
разбивая проблему на разрозненные, неэффективно маленькие фрагменты.
решение2
Ваше редактирование идет в правильном направлении: cp
не обязательно медленнее, чем tar | tar
. Зависит, например, от количества и размера файлов. Для больших файлов cp
лучше всего подойдет plain, так как это простая работа по перемещению данных. Для множества маленьких файлов логистика другая и tar
может быть лучше. См. напримерэтот ответ.