Copiando uma grande árvore de diretórios localmente? cp ou rsync?


230

Eu tenho que copiar uma grande árvore de diretórios, cerca de 1,8 TB. É tudo local. Por hábito, eu usaria rsync, no entanto, me pergunto se há muito sentido e se devo preferir cp.

Estou preocupado com permissões e uid / gid, pois elas precisam ser preservadas na cópia (eu sei que o rsync faz isso). Bem como coisas como links simbólicos.

O destino está vazio, então não preciso me preocupar em atualizar condicionalmente alguns arquivos. É todo o disco local, então não preciso me preocupar com ssh ou rede.

A razão pela qual eu ficaria tentado a sair do rsync é porque o rsync pode fazer mais do que eu preciso. arquivos de somas de verificação rsync. Não preciso disso e estou preocupado que isso possa levar mais tempo que o cp.

Então, o que você acha, rsyncou cp?


2
Se o rsync faz exatamente o que você deseja, se você já está familiarizado com o uso desse aplicativo em particular e se ele funciona com rapidez suficiente para se adequar ao seu gosto, por que diabos você deseja mudar?
Eleven81 20/07/09

2
Porque eu estou preocupado que rsync vai demorar mais do que cp, desde rsync faz muita checksumming que cp não vai fazer
Rory

1
A sobrecarga da CPU da soma de verificação é pequena em comparação com a E / S do disco / rede. A menos que o disco esteja no mesmo sistema e o sistema operacional possa fazer uma cópia inteligente da unidade no controlador de barramento.
276 Martin

3
A soma de verificação é feita em arquivos que diferem na verificação de tamanho e carimbo de data e hora. Se você é paranóico (como após uma queda de energia durante a cópia), pode forçar a soma de verificação em todos os arquivos, mas em uma transferência local, geralmente é mais lento do que começar do zero.
Korkman

3
Talvez ele esteja curioso para melhorar seu fluxo de trabalho e não enterre a cabeça na areia pensando que sabe tudo. Este comentário realmente me irrita.
Martin Konecny

Respostas:


204

Eu usaria o rsync, pois significa que, se for interrompido por qualquer motivo, você poderá reiniciá-lo facilmente com muito pouco custo. E sendo o rsync, pode até reiniciar parcialmente através de um arquivo grande. Como outros mencionam, ele pode excluir arquivos facilmente. A maneira mais simples de preservar a maioria das coisas é usar a -abandeira - 'arquivo'. Assim:

rsync -a source dest

Embora o UID / GID e os links simbólicos sejam preservados por -a(consulte -lpgo), sua pergunta implica que você pode querer uma cópia completa das informações do sistema de arquivos; e -anão inclui hard-links, atributos estendidos ou ACLs (no Linux) ou os acima nem bifurcações de recursos (no OS X.) Assim, por uma cópia robusta de um sistema de arquivos, você precisa incluir essas bandeiras:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

O cp padrão será iniciado novamente, embora o -usinalizador "copie somente quando o arquivo SOURCE for mais novo que o arquivo de destino ou quando o arquivo de destino estiver ausente" . E o -asinalizador (arquivo morto) será recursivo, não copia novamente os arquivos se você precisar reiniciar e preservar as permissões. Assim:

cp -au source dest

5
O sinalizador -u do cp provavelmente não é a melhor solução, pois não detectaria um arquivo parcialmente copiado / corrompido. O bom do rsync é que você pode fazer com que o md5 some os arquivos para detectar diferenças.
Chad Huneycutt

3
Adicionar a opção -w (--whole-file) aceleraria um rsync interrompido, pois apenas copiaria o arquivo em vez de somar a verificação.
hayalci

13
na verdade, o rsync detecta transferências locais e permite a cópia do arquivo inteiro sem somar automaticamente a verificação.
22633 korkman

22
e --progress que é realmente útil!
Matt

12
-P ou --progress mostra o progresso de cada arquivo individualmente. É útil para copiar arquivos grandes, não para muitos (milhares) arquivos pequenos, pois significa muito mais saída que você não pode ler. Não mostra o progresso geral de todos os arquivos combinados.
SPRBRN

106

Ao copiar para o sistema de arquivos local, sempre uso as seguintes opções de rsync:

# rsync -avhW --no-compress --progress /src/ /dst/

Aqui está o meu raciocínio:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

Vi transferências 17% mais rápidas usando as configurações rsync acima sobre o seguinte comando tar, conforme sugerido por outra resposta:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
Estou tendo o seguinte erro: rsync: --no-compress: unknown option@ Ellis Percival.
Alper 3/03

Isso é muito rápido. Mais rápido do que isso rm -rf /src/.
dgo 18/07/19

2
Como o @alper, --no-compress não era uma opção para a minha versão do rsync (no CentOS 7); Eu usei --compress-level = 0.
Paul

79

Quando tenho que copiar uma grande quantidade de dados, geralmente uso uma combinação de tar e rsync. A primeira passagem é tar, algo como isto:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

Geralmente, com uma grande quantidade de arquivos, haverá alguns que o tar não pode manipular por qualquer motivo. Ou talvez o processo seja interrompido ou, se for uma migração do sistema de arquivos, você poderá fazer a cópia inicial antes da etapa real da migração. De qualquer forma, após a cópia inicial, eu faço uma etapa rsync para sincronizar tudo:

# cd /dst; rsync -avPHSx --delete /src/ .

Observe que a barra final /src/é importante.


6
+1 Eu achei o tar geralmente mais rápido para cópias grandes do que o rsync. Também gosto da idéia de terminar com um rsync final.
9603 Geoff Fritz

2
tar é uma boa opção se o dir dir estiver vazio. Embora meu caminho fosse: cd $ DSTDIR; alcatrão c -C $ SRCDIR. | tar
asdmin

19
Essa é a beleza desse método. Você não precisa dobrar o espaço, porque nunca cria um arquivo tar intermediário. O alcatrão antes do tubo empacota os dados e os transmite para stdout, e o alcatrão após o tubo o pega do stdin e o desempacota.
Chad Huneycutt

4
Eu fiz um cp -a para uma transferência de 12gb e esse método para uma transferência de 42gb. O método do alcatrão levou cerca de 1/4 do tempo.
NGaida 23/05

3
Eu também coloquei pvno meio para poder observar o progresso, estimando o tamanho de todos os dados usando df. Eu também usei --numeric-owner, como o disco de origem era de outro sistema e não queria tarmexer com os proprietários:tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
Petr Pudlák

14

rsync

Aqui está o rsync que eu uso, prefiro cp para comandos simples, não esse.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

Aqui está uma maneira ainda mais segura, cpio. É tão rápido quanto o alcatrão, talvez um pouco mais rápido.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

alcatrão

Isso também é bom e continua com falhas de leitura.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

Observe que todos são apenas para cópias locais.


Por que você usa os sinalizadores -S e -D para rsync?
miyalys

7

O que você preferir. Só não esqueça a -aopção quando você decidir usar cp.

Se você realmente precisa de uma resposta: eu usaria o rsync porque é muito mais flexível. Precisa desligar antes de concluir a cópia? Basta pressionar Ctrl-C e continuar assim que estiver de costas. Precisa excluir alguns arquivos? Apenas use --exclude-from. Precisa alterar a propriedade ou as permissões? O rsync fará isso por você.


O que o sinalizador -p faz novamente?
Rory

1
Preservará a propriedade, os carimbos de data e hora e as permissões.
21139 innaM

5
cp -a seria melhor.
21720 David Pashley

De fato. A resposta mudou de acordo.
21139 innaM

7

O rsynccomando sempre calcula somas de verificação em cada byte transferido.

A opção de linha de comando --checksumrefere-se apenas ao uso de somas de verificação de arquivos para determinar quais arquivos transferir ou não, ou seja:

-c, --checksum pular com base na soma de verificação, não no tempo e tamanho da modificação "

A página de manual também diz o seguinte:

Observe que o rsync sempre verifica se cada arquivo transferido foi reconstruído corretamente no lado receptor, verificando a soma de verificação de todo o arquivo, mas essa verificação automática após a transferência não tem nada a ver com a opção antes da transferência "Este arquivo precisa ser atualizado?" Verifica.

Assim rsynctambém, sempre, calcula uma soma de verificação de todo o arquivo no lado de recebimento, mesmo quando a -c/ --checksumopção está "desativada".


14
Enquanto a sua postagem adicionou algumas informações interessantes aqui, os comentários e insultos diminuem o valor da sua postagem. Este site não é um fórum para discussões não construtivas. Se você conseguiu modificar a fonte, enviou as modificações como um patch? Você postou sua versão no github ou algo assim? Se você se sente tão fortemente sobre isso, pode ser melhor se você tentar fazer algo um pouco mais construtivo, em vez de ser um insulto desnecessário.
precisa

Sim, o último parágrafo não era realmente necessário.
Flight Sherwin

6

rsync -aPhW --protocol=28ajuda a acelerar essas cópias grandes com o RSYNC. Eu sempre vou rsync porque o pensamento de estar no meio do 90GiB e quebrar me afasta da CP


2
Qual é o valor de usar o protocolo mais antigo nessa cadeia de comandos?
ewwhite

1
Em uma máquina Mac, a versão mais antiga do Rsync fornecida trava em algumas rotações mais recentes do protocolo rsync, como 29. Indicar para que ele mude para o protocolo mais antigo faz com que NÃO verifique repetidamente.
Onevynick

Eu acho que o número 28 não é mais válido?
SPRBRN

5

O rsync é ótimo, mas tem problemas com árvores de diretório muito grandes porque armazena as árvores na memória. Eu só estava olhando para ver se eles resolveriam esse problema quando encontrei este tópico.

Eu também encontrei:

http://matthew.mceachen.us/geek/gigasync/

Você também pode dividir manualmente a árvore e executar vários rsyncs.


12
Se você usa a versão 3, ela não mantém toda a árvore na memória, se for grande, usa um algoritmo de recursão incremental: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

Esse tópico foi muito útil e, como havia muitas opções para alcançar o resultado, decidi fazer o benchmark de algumas delas. Acredito que meus resultados podem ser úteis para que outras pessoas tenham uma noção do que funcionou mais rapidamente.

Para mover 532Gb de dados distribuídos entre 1.753.200 arquivos , tivemos o seguinte:

  • rsync levou 232 minutos
  • tar levou 206 minutos
  • cpio levou 225 minutos
  • rsync + parallel levou 209 minutos

No meu caso, eu preferi usar rsync + parallel. Espero que esta informação ajude mais pessoas a decidir entre essas alternativas.

A referência completa é publicada aqui


404 página não encontrada
Amedee Van Gasse

1
Graças @AmedeeVanGasse URL foram corrigidos um curto depois que você relatou :)
arjones

Por que não fazer benchmarking cp? Este é o título da pergunta!
Calandoa

@calandoa Eu acho que cpé inseguro, ou seja: quando ele quebra você tem que começar de novo, isso é como eu favorecer opções que podem retomar, ergo rsyncé o meu favorito :)
arjones

3

Ao fazer uma cópia de diretório local local, minha experiência é que "cp -van src dest" é 20% mais rápido que o rsync. No que diz respeito à capacidade de reinicialização, é isso que "-n" faz. Você só precisa remover o arquivo parcialmente copiado. Não é doloroso, a menos que seja um ISO ou algo parecido.


2

ARJ É UMA ESCOLA TÃO VELHA !! Eu realmente duvido que o ARJ e / ou o rsync dêem desempenho.

Definitivamente, o que eu sempre faço é usar o cpio:

find . -print | cpio -pdm /target/folder

Isso é quase rápido que o CP, definitivamente mais rápido que o alcatrão e sem canalizar nada.


2
"Os utilitários originais cpio e find foram escritos por Dick Haight enquanto trabalhavam no Unix Support Group da AT&T. Eles apareceram pela primeira vez em 1977 no PWB / UNIX 1.0" - cpiopágina de manual do FreeBSD .
Chris S

3
cpioinfelizmente, tem um limite superior de 8 GB para arquivos.

" sem canalizar nada " [sic]. Exceto o findcomando, como você listou, tem um tubo na mesma:find . -print | cpio -pdm /target/folder
Warren

1

Você definitivamente quer experimentar o rclone . Essa coisa é louca rápido:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Esta é uma cópia local de e para um SSD LITEONIT LCS-256 (256GB).

Você pode adicionar --ignore-checksumna primeira execução para torná-la ainda mais rápida.



0

tar também faria o trabalho, mas não será interrompido como o rsync fará.


Uma resposta antiga, mas não é o TAR para criar arquivos compactados de arquivos? Como poderia ser usado para transferir arquivos como rsync ou cp?
Sherwin Flight

Fonte de CD @SherwinFlight; tar cf -. | (cd dest; tar xf -)
pgs 26/10

0

E se você usar ARJ?

arj a -jm -m1 -r -je filepack /source

onde -jm -m1estão os níveis de compactação e o -jetorna um executável. Agora você tem uma lista de arquivos encapsulada.

Em seguida, para extração para o mapa de destino

filepack -y  

onde o mapa de origem será feito (onde -yé sempre aceitar, substituir, pular etc)

Pode-se então scp ftp o pacote de arquivos para a área de destino e executá-lo, se isso for possível.


1
Arj? Isso não morreu nos anos 80?
Michael Hampton

talvez o início dos anos 90, se você acredita wikipedia
Matt

0

Existem algumas acelerações que podem ser aplicadas a rsync:

Evitar

  • -z/ --compress: a compactação carregará apenas a CPU, pois a transferência não está na rede, mas na RAM.
  • --append-verify: retoma uma transferência interrompida. Parece uma boa idéia, mas tem o caso de falha perigosa: qualquer arquivo de destino do mesmo tamanho (ou maior) que a fonte será IGNORADO. Além disso, verifica o arquivo inteiro no final, o que significa que não há aceleração significativa --no-whole-fileao adicionar um caso de falha perigoso.

Usar

  • -S/ --sparse: transforma sequências de nulos em blocos esparsos
  • --partialou -Pqual é --partial --progress: salve os arquivos parcialmente transferidos para futura retomada. Nota: os arquivos não terão um nome temporário, portanto, garanta que nada mais espere usar o destino até que toda a cópia seja concluída.
  • --no-whole-filepara que qualquer coisa que precise ser reenviada use transferência delta. Ler metade de um arquivo parcialmente transferido geralmente é muito mais rápido do que escrevê-lo novamente.
  • --inplace para evitar a cópia do arquivo (mas apenas se nada estiver lendo o destino até que toda a transferência seja concluída)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.