scp sem substituir os arquivos existentes no destino

137

Como copio um diretório inteiro para um diretório de mesmo nome sem substituir o conteúdo no diretório de destino? (em vez disso, gostaria de adicionar ao conteúdo da pasta de destino)

    
por Daniel Böhmer 21.09.2009 / 02:13

8 respostas

112

Use rsync e passe -u se desejar apenas atualizar arquivos mais recentes no diretório original ou --ignore-existing para ignorar todos os arquivos que já existem no destino.

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

(Observe o / no lado da origem: sem ele rsync criaria /remote/directory/directory .)

    
por 02.06.2011 / 20:23
71

scp irá sobrescrever os arquivos se você tiver permissões de escrita para eles.

Em outras palavras: Você pode fazer com que scp efetivamente ignore os arquivos, removendo temporariamente as permissões de gravação neles (se você for o proprietário dos arquivos, isto é).

    
por 15.10.2012 / 23:10
13

Você pode copiar apenas novos arquivos por data. Use find

scp  'find /data/*.gz -type f -mtime +7' USER@SERVER:/backup/
    
por 16.01.2014 / 14:19
7

Se você pode tornar o conteúdo do arquivo de destino somente leitura:

find . -type f -exec chmod a-w '{}' \;

antes de executar scp (ele irá reclamar e ignorar os arquivos existentes).

E altere-os novamente depois ( chmod +w para obter um valor baseado em umask). Se os arquivos nem todos têm permissão de escrita de acordo com sua umask, você teria que armazenar as permissões para que você possa restaurá-las.

(a resposta de Gilles sobrescreve os arquivos existentes se, localmente, eles são mais recentes, eu perdi dados valiosos dessa maneira. Não entendo por que essa resposta errada e prejudicial tem tantos votos positivos).

    
por 27.11.2013 / 07:07
6

Eu tive uma tarefa semelhante, no meu caso, não consegui usar rsync , csync ou FUSE porque meu armazenamento tem apenas SFTP. rsync não pôde alterar a data e a hora do arquivo, alguns outros utilitários (como csync ) me mostraram outros erros: " Não é possível criar o arquivo temporário Desvio do relógio detectado ".

Se você tiver acesso ao servidor de armazenamento - basta instalar openssh-server ou iniciar rsync como um daemon aqui.

No meu caso - eu não consegui fazer isso e a solução foi: lftp . O uso de lftp para sincronização está abaixo:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder - é a pasta no meu PC, /rem/folder - é sftp://sft.domain.tld/rem/folder .

Você pode encontrar páginas man pelo link: link

    
por 03.09.2014 / 00:40
4

Para copiar um monte de arquivos, é mais rápido colocá-los em ação. Usando -k, você também evita que o tar substitua os arquivos ao descompactá-lo no sistema de destino.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 
    
por 21.08.2016 / 09:23
0

scp sobrescreve arquivos e não há opção para parar com isso, mas você pode copiar as coisas do jeito, fazer o scp e depois copiar os arquivos existentes de volta. Exemplos:

  1. Copie todos os arquivos existentes para fora do caminho

    mkdir original_files ; cp -r * original_files/
    
  2. Copie tudo usando scp

    scp -r user@server:dir/* ./
    
  3. Copie os arquivos originais sobre qualquer coisa que o scp escreveu:

    cp -r original_files/* ./
    
por 21.04.2016 / 18:57
-2

Outra maneira de conseguir isso é fazer um ls na pasta de destino:

Na pasta de destino remoto: 1.ls | awk '{print "mv" $ 1 "../copied_data/"}' > mv_copied_data

2.scp mv_copied_data [email protected]: / caminho / para / source / folder

Na fonte: 3. cd / path / to / source / folder

  1. chmod 777 mv_copied_data
  2. ./ mv_copied_data

No destino: scp -r [email protected]: / caminho / para / fonte / pasta / caminho / para / destino / foldeer

    
por 24.09.2018 / 07:14