Para copiar recursivamente um diretório, usar tar
para compactar um diretório e depois canalizar a saída para outro tar
para descompactar parece ser muito mais rápido do que usar cp -r
(ou cp -a
).
Por que é isso? E por que não pode cp
ser mais rápido fazendo isso da mesma maneira nos bastidores?
Editar: notei essa diferença ao tentar copiar uma enorme estrutura de diretórios contendo dezenas de milhares de arquivos e pastas, profundamente aninhados, mas totalizando apenas cerca de 50 MB. Não tenho certeza se isso é relevante.
Responder1
Cp
faz open-read-close-open-write-close em um loop sobre todos os arquivos. Assim, a leitura de um lugar e a escrita para outro ocorrem totalmente intercaladas. Tar|tar
faz leitura e gravação em processos separados e, além disso, tar
usa vários threads para ler (e gravar) vários arquivos 'de uma só vez', permitindo efetivamente que o controlador de disco busque, buffer e armazene muitos blocos de dados de uma só vez. Em suma, tar
permite que cada componente funcione de forma eficiente, ao mesmo tempo que cp
divide o problema em pedaços díspares e ineficientemente pequenos.
Responder2
Sua edição vai na boa direção: cp
não é necessariamente mais lenta que tar | tar
. Depende, por exemplo, da quantidade e tamanho dos arquivos. Para arquivos grandes, uma planície cp
é melhor, pois é um trabalho simples de enviar dados. Para muitos arquivos pequenos, a logística é diferente e tar
pode funcionar melhor. Veja por exemploesta resposta.