Para copiar recursivamente um diretório, usar tar
para empacotar um diretório e 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 feito mais rápido, fazendo da mesma maneira sob o capô?
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.
Respostas:
Cp
abre-lê-fecha-abre-escreve-fecha em um loop sobre todos os arquivos. Portanto, ler de um lugar e escrever para outro ocorre totalmente intercalado.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 ao controlador de disco buscar, armazenar em buffer e armazenar muitos blocos de dados ao mesmo tempo. Em suma,tar
permite que cada componente trabalhe com eficiência, enquantocp
divide o problema em pedaços díspares e ineficientemente pequenos.fonte
cp
implementações? Como sabemos que isso é verdade? E por quecp
seria escrito de maneira tão ineficiente? Qualquer implementação de livro de cópia de um arquivo lê um buffer de n bytes de cada vez e os grava no disco antes de ler outros n bytes. Mas você está dizendo quecp
sempre lê o arquivo inteiro antes de escrever a cópia inteira?