O scp pode copiar diretórios recursivamente?


573

Atualmente, só posso copiar um único .tararquivo. Mas como posso copiar diretórios recursivamente scp?

Respostas:


937

Sim, use -r:

scp -rp sourcedirectory user@dest:/path
  • -r significa recursivo
  • -p preserva os tempos de modificação, os tempos de acesso e os modos do arquivo original.

Nota: Isso cria o sourcedirectoryinterior, /pathassim os arquivos estarão em/path/sourcedirectory


9
No entanto, lembre-se de que isso não preservará os links simbólicos.
CpnCrunch

12
Observe que -pr(as opções na ordem inversa) não copiarão as pastas, mas sim o conteúdo no diretório de destino (aparentemente, a ordem das opções é importante).
pms

172

Embora as respostas anteriores estejam tecnicamente corretas, você também deve considerar o uso rsync. rsynccompara os dados nos lados de envio e recebimento com um mecanismo diff, para que não seja necessário reenviar dados que já foram enviados anteriormente.

Se você deseja copiar algo para uma máquina remota mais de uma vez, use rsync. Na verdade, é bom usar o rsynctempo todo, porque ele tem mais controles para coisas como copiar permissões e propriedade de arquivos e excluir determinados arquivos ou diretórios. Em geral:

$ rsync -av /local/dir/ server:/remote/dir/

sincronizará um diretório local com um diretório remoto. Se você executá-lo uma segunda vez e o conteúdo do diretório local não for alterado, nenhum dado será transferido - muito mais eficiente do que executar scpe copiar tudo sempre.

Além disso, rsyncpermite recuperar de transferências interrompidas com muita facilidade, ao contrário scp.

Finalmente, as versões modernas de, rsyncpor padrão, executam o ssh, portanto, se scpjá estiver funcionando, rsyncdeve ser um substituto.


1
Eu concordo rsyncé mais eficiente. Uma coisa que atualmente não scpfaz é permitir a cópia entre hosts remotos (pelo menos sem executar o cliente rsync em um deles).
Cedric Cavaleiro

1
-av: v é para verbose, a para arquivamento e é um atalho para -rlptgoD que implica recursiva, preserva datas e links do proprietário dos direitos. Se você quer apenas uso recursivo-r
pdem 26/09



6

A melhor maneira é usar o rsync sobre SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Minhas opções de favoritos são -Pazvessh --delete:

  • -a: modo de arquivamento (inclui muitas opções comuns padrão, incluindo preservação de links simbólicos)
  • -z: comprimir
  • -v: detalhado: mostra arquivos
  • -P: mostra o progresso como arquivos concluídos / arquivos restantes
  • -e ssh: faz o rsync no protocolo ssh
  • --delete: exclui arquivos no destino que não estão mais na origem

Todas as versões rsyncque usei usariam sshpor padrão, portanto -esshé improvável que seja necessário. E a escolha do comando usado para conectar-se ao host remoto não tem nenhuma relação com a cópia recursiva.
kasperd

4

Depois de procurar o sinalizador de cópia recursiva e usá-lo com sucesso graças a este post, gostaria de postar apenas uma sugestão.

Se for o caso, você está copiando (recursivamente) um diretório. Talvez se os arquivos forem enviados compactados, você poderá economizar tempo na transferência

O que eu fiz no final foi:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Espero que isto ajude


a extensão do arquivo deve ser .tar.gzou .tgzuma vez que o arquivo é um arquivo tar compactado com gzip (desde que o -zsinalizador seja usado).
Anthonybell 26/03

2

Você pode copiar recursivamente um diretório em um arquivo compactado com este comando simples:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Por exemplo, para copiar o conteúdo de /var/logde domain.compara ~/logs.tgzvocê executar:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

Você também pode extrair arquivos no sistema de destino usando pipes. Este comando copiará o conteúdo de /var/logat domain.compara ~/destination/logno seu sistema:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Embora espelhe um diretório, você provavelmente deve usar rsync...


1

Se você preferir passar a senha do usuário como parâmetro, em vez de inseri-la interativamente, use sshpass( sudo apt-get install -y sshpass).

Exemplo:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

Você pode usar a opção -r com o comando scp para copiar diretórios recursivamente em qualquer sistema. Se você precisar de mais alguma coisa, consulte o tutorial do comando scp . A opção -r significa operação recursiva na maioria dos comandos do Linux.


Embora verdadeira, a -ropção já foi sugerida anos atrás e é a resposta aceita.
RalfFriedl 22/04

-3

Outra opção (provavelmente melhor para uso repetido) é usar o NFS - confira o nfs-kernel-server e como configurar os compartilhamentos NFS.


2
Isso é um absurdo completo. Existem infinitos casos em que você usaria, scpmas o NFS não é uma opção.
Sven
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.