O scp pode copiar diretórios recursivamente?

573

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

núcleo
fonte

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

dmourati
fonte
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.

Phil Hollenback
fonte
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
32

É para isso que serve a -ropção. :)

Consulte a página do manual scp para obter mais informações, se necessário.

HedgeMage
fonte
11

Opção de cópia recursiva '-r' (minúscula)

scp -r

O que confundo com a opção de cópia recursiva local regular '-R' (maiúscula)

cp -R
Tarun
fonte
1
Eu só queria destacar a diferença entre cp e scp, pois -r e -R não são os mesmos. unix.stackexchange.com/questions/18712/…
Tarun
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
mick
fonte
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

user9869932
fonte
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 [email protected]  '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 [email protected]  '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 [email protected]  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

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

Anubioz
fonte
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 [email protected]:/dest/folder
Franck Dernoncourt
fonte
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.

atthik
fonte
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.

Andrei Pokrovsky
fonte
2
Isso é um absurdo completo. Existem infinitos casos em que você usaria, scpmas o NFS não é uma opção.
Sven