Como copiar apenas novos arquivos usando o comando "scp"?

24

Eu estava copiando centenas de arquivos para outro computador usando o scpcomando que recebi o stalled erro . Agora vou copiar os arquivos novamente. Existe alguma maneira de evitar a cópia dos arquivos já copiados?

Meysam
fonte

Respostas:

40

Você pode usar rsyncpara isso. rsyncé realmente projetado para esse tipo de operação.

Sintaxe:

rsync -avh /source/path/ host:/destination/path

ou

rsync -a --ignore-existing /local/directory/ host:/remote/directory/

Quando você o executa pela primeira vez, ele copia todo o conteúdo e copia apenas novos arquivos.

Se você precisar encapsular o tráfego através de uma conexão SSH (por exemplo, para fins de confidencialidade), conforme indicado por você originalmente solicitando uma solução baseada em SCP, basta adicionar -e sshos parâmetros a rsync. Por exemplo:

rsync -avh -e ssh /source/path/ host:/destination/path
um CVn
fonte
É --ignore-existingrealmente necessário?
Meysam
Porque neste exemplo de manual: rsync -t *.c foo:src/-> "Isso transfere todos os arquivos correspondentes ao padrão * .c do diretório atual para o diretório src na máquina foo. Se algum dos arquivos já existir no sistema remoto, o rsync remote- protocolo de atualização é usado para atualizar o arquivo, enviando apenas as diferenças "
Meysam 14/12
1
Eu normalmente uso rsync -avuzh /source/path/ host:/destination/path. Isso faz todo o trabalho em um comando e, nas chamadas subseqüentes, apenas transfere os arquivos que precisam dele.
Edward Falk
6

Se você quiser ficar com o scp por qualquer motivo, poderá remover as permissões w dos seus dados locais (se tiver o direito de fazê-lo) e o scp não tocará neles. Para ser mais preciso:

  1. chmod a-w local/*.tar.gz (no seu diretório local)
  2. scp remote/*.tar.gz local

Isso não é muito eficiente, agradável, mas pode ajudar se você precisar de uma solução temporária rápida sem mudar para outra coisa além de scp. (Kudos: scp sem substituir arquivos existentes no destino )

xhudik
fonte
Eu realmente gosto desta solução. Estou coletando arquivos de sensores remotos em um arquivo. Todos os diretórios de trabalho - cada um tem um subdiretório Archive. Depois que os arquivos entram no arquivo, eles nunca serão alterados. Seria muito fácil marcar os arquivos arquivados como -w, para que seja isso que eu faço. E os arquivos de trabalho fora dos diretórios de arquivamento podem ser deixados como estão, portanto, se eu executar o programa de atualização durante o dia, ele ainda copiará os arquivos em andamento. Era exatamente isso que eu estava procurando. TNX muito!
SD283
4

Não havia uma resposta exata sobre como fazer isso com o SCP, pois era isso que a pergunta original estava perguntando.

sudo find /files/ -type f -exec chmod a-w {} \;

scp -r [email protected]:/file/location/* /files

Quando terminar de copiar os arquivos, altere as permissões novamente:

sudo chmod a+w -R /files

Rick
fonte
1
Bem, sem dúvida, a pergunta original era "como posso resolver esse problema", para o qual o rsync é a resposta.
Edward Falk