Como copiar um diretório inteiro para um diretório com o mesmo nome sem substituir o conteúdo no diretório de destino? (em vez disso, eu gostaria de adicionar ao conteúdo da pasta de destino)
Como copiar um diretório inteiro para um diretório com o mesmo nome sem substituir o conteúdo no diretório de destino? (em vez disso, eu gostaria de adicionar ao conteúdo da pasta de destino)
Respostas:
Use rsync
e passe -u
se desejar atualizar apenas os arquivos mais recentes no diretório original ou --ignore-existing
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 /
lado da fonte: sem ele rsync
criaria /remote/directory/directory
.)
--ignore-existing
adiciona sem substituir, que perda de dados você vê?
rsync
disponível com facilidade .... (Como Win32-OpenSSH)
--rsync-path
é necessária)
O scp substituirá os arquivos se você tiver permissões de gravação para eles.
Em outras palavras: você pode scp
efetivamente pular esses arquivos removendo temporariamente as permissões de gravação neles (se você é o proprietário dos arquivos).
scp -r user@server.com:/location/of/files/* /local/location/
Você pode copiar apenas novos arquivos por data. Usarfind
scp `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/
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 pular os arquivos existentes).
E altere-os novamente depois ( chmod +w
para obter um valor baseado em umask). Se nem todos os arquivos tiverem permissão de gravação de acordo com o umask, você precisará armazenar as permissões para poder restaurá-las.
(A resposta de Gilles substitui os arquivos existentes, se eles forem mais novos localmente, perdi dados valiosos dessa maneira. Não entendo por que essa resposta errada e prejudicial tem tantos votos positivos).
rsync --ignore-existing
você perdeu dados?
find: missing argument to '-exec'
de utilizar este comando, e em vez teve de usar: find . -type f -exec chmod a-w {} \;
. Meu linux está ruim, sim.
find . -type f -exec chmod a-w {} \;
Eu tinha uma tarefa semelhante, no meu caso eu não poderia usar rsync
, csync
ou FUSE porque meu armazenamento tem apenas SFTP. rsync
não foi possível alterar a data e a hora do arquivo, alguns outros utilitários (como csync
) me mostraram outros erros: " Não foi possível criar o arquivo temporário A inclinação do relógio foi detectada ".
Se você tiver acesso ao servidor de armazenamento - basta instalar openssh-server
ou iniciar rsync
como um daemon aqui.
No meu caso - não pude fazer isso e a solução foi: lftp . lftp
O uso da 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 as páginas de manual no link: http://lftp.yar.ru/lftp-man.html
Para copiar um monte de arquivos, é mais rápido tar. Ao usar -k, você também evita que o tar substitua arquivos ao descompactá-lo no sistema de destino.
tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>'
scp
sobrescreve arquivos e não há como impedir que isso seja feito, mas você pode copiar as coisas do caminho, fazer o scp e depois copiar os arquivos existentes novamente. Exemplos:
Copie todos os arquivos existentes do caminho
mkdir original_files ; cp -r * original_files/
Copie tudo usando scp
scp -r user@server:dir/* ./
Copie os arquivos originais sobre qualquer coisa que o scp tenha escrito:
cp -r original_files/* ./
Outra maneira de conseguir isso é fazer um ls
na pasta de destino:
Na pasta de destino remoto:
ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder
Na fonte:
cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data
No destino:
scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer
-
>
nova linha de espaço ou outros caracteres especiais. 3. Codifique um loop for em um script python. Gerar um programa em tempo de execução é difícil e complicado (mesmo quando feito por programadores profissionais), por várias razões. Gerar um script de shell é ainda pior - uma péssima idéia.