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