Cópia de diretório recursiva / profunda da linha de comando no Linux?

13

Qual é uma maneira geral boa de fazer uma cópia de diretório profunda / recursiva no Linux que funciona na maioria dos casos? Eu usei coisas simples cp -R, bem como cpioencantamentos bastante elaborados . Existem pontos fortes ou fracos significativos que fazem com que você prefira um sobre o outro? Qual você usa com mais frequência?

Greg Mattes
fonte

Respostas:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Então, em resposta à sua pergunta:

cp -a /foo /bar

Copie tudo recursivamente do diretório / foo para o diretório / bar, preservando os links simbólicos e o arquivo / diretório 'mode' 'posse' e 'timestamps'.

Gareth
fonte
Esta é certamente uma solução muito direta e elegante. Você já encontrou alguma desvantagem nessa abordagem? Sistemas de arquivos distribuídos? Cópias extremamente grandes? Você encontrou outras soluções, como cpio, tar ou rsync, para ser mais eficiente em alguns casos?
Greg Mattes
1
A menos que haja um erro físico, nunca tive um 'cp' local com falha de memória (fiz apenas transferências com tamanho de TB) para qualquer local montado localmente (independentemente da montagem NFS ou Samba). Confira 'USAGE' na página de manual do rsync para obter exemplos que você achará instrutivo. Favorito dos meus: $ rsync --partial --progress --rsh = ssh --archive --verbose --compress foo / user @ nome_do_host: ~ / bar (rsync -avzP)
Gareth
Como observei acima, -a não é estritamente portátil.
Matthew Flaschen
Bem, eu sei que o busybox, GNU e BSD cp estão bem. Além das caixas legadas do Unix, nunca vi no que isso não funcionaria? Eu realmente não entendo o argumento, embora eu entenda completamente o sentimento de Zoredache de "Parece sempre fazer o trabalho corretamente, por isso nunca me esforcei muito para encontrar um substituto".
1330 Gareth
@gyaresu Considere dividir seu segundo comentário em outra resposta para que possamos votar nele.
Greg Mattes
6

Eu uso um comando como "cd $ srcdir; tar -c. | Tar -C $ destdir -x" com mais freqüência. Mas também uso rsync -a $ src $ dst.

A maior força da solução tar é que era o que eu tinha que usar em um sistema há muitos anos que não tinha cpio, rsync ou um cp que copiasse recursivamente. O alcatrão está praticamente em todo lugar. Está preso na minha cabeça porque usei muito, provavelmente existem maneiras mais elegantes. Sempre parece fazer o trabalho corretamente, por isso nunca me esforcei muito para encontrar um substituto.

Zoredache
fonte
Eu gosto muito do argumento da "onipresença do alcatrão". Sou proficiente em vi por razões semelhantes, mesmo que prefira outros ambientes de edição.
Greg Mattes
-R faz muito tempo faz parte do padrão ( opengroup.org/onlinepubs/009695399/utilities/cp.html ), embora não -a.
214 Matthew Flaschen
@ Matthew Flaschen: Seu comentário é destinado à resposta de @ gyaresu?
Greg Mattes
Também é relevante para este, pois Zoredache disse que encontrou um sistema que "não tinha um [...] CP que copiasse recursivamente". Basicamente, -R -> portátil, -a -> não portátil.
217 Matthew Flaschen
1
Isso foi em ~ 95 e o sistema estava executando uma versão final do anos 80 do Unix. Eu não acho que -R era uma opção para cp, mas não tenho certeza. Eu aprendi esse boato lendo a usenet.
Zoredache
6

Dê uma olhada em um rsync ... Gosto porque você copia menos dados ao manter dois diretórios atualizados ... também pode funcionar remotamente. Em sua forma mais simples, rsync -a / src / dest

trent
fonte
Este é realmente um bom ponto. Essencialmente, o rsync tem a capacidade de calcular uma "diferença de diretório" e transferir apenas o necessário para sincronizar os diretórios. Portanto, você pode chamar repetidamente algo como rsync -a src / dest para "copiar continuamente" diretórios recursivamente (o trailing / on src é necessário para a sincronização adequada) enquanto cp -a src / dest não funciona assim. O comando cp criará um novo diretório src em dest após o primeiro cp. Você precisaria de algo como cp -au src / * dest para cópias subsequentes.
1811 Greg Mattes #
A outra razão pela qual eu gosto do rsync é que você pode passar o sinalizador -P, que mostra uma barra de progresso. Ele lhe dá uma idéia de quanto tempo algo vai demorar
Rory
0

rsyncé uma ótima ferramenta. É o canivete suíço de transferência de dados. É uma ferramenta tão simples e poderosa. Depois de começar a usá-lo, você fica viciado.

Rory
fonte