Eu gostaria de usar o rsync para ...
- excluir arquivos no lado de recebimento que também foram excluídos no lado de envio
- exclua outros arquivos que estão no diretório rsynced do lado receptor
Por exemplo, digamos que eu tenho um diretório local-src
:
ANTES: local-src
contém localmente ...
a.txt
b.txt
c.txt
meu diretório remoto que eu gostaria de sincronizar com o conteúdo de local-src
é chamado remote-src
.
ANTES: remote-src
contém remotamente ...
a.txt
b.txt
c.txt
d.txt
README.md
Digamos que eu exclua alguns arquivos em local-src
:
APÓS EXCLUIR LOCAL: local-src
contém localmente ...
c.txt
Como posso usar o rsync de forma a garantir que os arquivos excluídos na origem também sejam excluídos no destino, mas sem excluir outros arquivos no destino. Por exemplo, eu gostaria de ter o seguinte no destino:
APÓS DELETE LOCAL: remote-src
contém remotamente ...
c.txt
d.txt
README.md
Ou seja, a.txt
e b.txt
estão remotamente apagado bem, mas d.txt
e README.txt
são deixados sozinhos.
Existe alguma maneira de conseguir isso com o rsync?
EDIT: O veredicto parece ser que isso pode ser impossível com o rsync. Me perguntaram por que preciso disso, para ilustrar meu caso de uso:
Digamos que eu tenho um servidor web. Nesse servidor web, eu tenho vários diretórios, digamos que eu tenho um diretório A
e um public_html
diretório dos quais meu site é veiculado. Digamos que eu tenho algum processo automatizado que produz arquivos no diretório A
. Eu gostaria de rsync (ou sincronização usando alguma outra ferramenta) os arquivos gerados ou atualizados em A
ao public_html
diretório, sem excluir outros arquivos arbitrários que podem estar dentro public_html
. Eu certamente não quero que o rsync exclua acidentalmente meu site.
Se o rsync não é a ferramenta para este trabalho, alguém sabe como eu posso fazer isso?
rsync
pois não há como saber quais arquivos já estão na pasta remota. Você pode precisar descobrir outra ferramenta.Respostas:
O que você quer fazer é razoável, mas usá
rsync
-lo por conta própria não é. Então a resposta é não .O motivo é simples:
rsync
não mantém histórico do que estava em cada diretório e não tem como saber o que precisa ser excluído e o que não. Não sem suporte adicional.Você deve se perguntar por que gosta de fazer isso
rsync
e deixar isso mais claro. Existem outros programaslibrsync1.so
que são mais inteligentes.Com as restrições relaxadas de que você não precisa
rsync
, você pode dar uma olhada no rdiff-backup :Isto mostra
xx
eyy
estão emb
.Isto mostra
xx
ezz
estão emb
.rdiff-backup
também mantém um diretóriordiff-backup-data
,b
para que você possa reverter quaisquer alterações; limpe-o regularmente usando osrdiff-backup
comandos (O exemplo é com arquivos locais para mostrar que dados extras no destino não são excluídos, mas o rdiff-backup também funciona em uma rede).Outra alternativa é configurar algum sistema de controle de revisão distribuído (mercurial, bazar, git). Com mercurial, por exemplo, você pode ter um script (eu uso um Makefile para isso), que envia todas as alterações ao servidor e faz uma atualização dos arquivos com check-out por lá, ignora todos os arquivos adicionais que estão no servidor remoto (mas têm não foi colocado sob controle de revisão).
No servidor, você faria:
No cliente:
Agora, se você remover um arquivo no cliente e fazer:
Seu arquivo removido é removido no servidor, mas outros dados (não adicionados ao repositório) não são excluídos.
fonte
A
, onde algum processo é automatizado e os arquivos são gerados automaticamente lá. Eu tenho um servidor da web e gostaria que os arquivosA
contidos fossem sincronizados nopublic_html
diretório do servidor da web, é claro, sem excluir tudo o mais napublic_html
pasta do servidor da web. Se alguém tiver alguma idéia para conseguir isso com outra ferramenta, seria mais que bem-vindo. Vou atualizar minha pergunta para refletir isso.local-src
diretório sem ter algum processo observando esse diretório para alterações. Talvez isso fosse difícil.rsync
não é a ferramenta. Por favor, perceber quesync
emrsync
vem de sincronização e que não é exatamente o que você quer fazer. No desenvolvimento dorsync
foco tem sido eficiente (minimizar) a transferência de dados. Outras ferramentas comordiff-backup
(e possívelcvsup
) usaram suas técnicas para isso, mas foram desenvolvidas com recursos adicionais.Eu não acho que isso seja possível sem excluir explicitamente os arquivos no lado de recebimento como parte do comando rsync. Consulte a seção da página de manual do rsync: "REGRAS POR EXTREMIDADE E EXCLUIR".
fonte
Se eu entendi corretamente,
--exclude
pode ser o que você está procurando:fonte
Eu tenho uma resposta para isso. Eu acho que funciona. E funciona para mim . Primeiro você deve ter
rsync
arquivos remotos em arquivos locais. O lado local contém todos os arquivos.agora no lado local
Em seguida, você pode excluir os arquivos ou fazer o que quiser. (No lado local). Na sua pergunta, você exclui esses arquivos.
arquivos excluídos
Depois disso, você pode
rsync
arquivos locais para o lado remoto. Em seguida, ambos os lados têm os mesmos arquivos.dá
arquivos no lado remoto e no lado local (ao usar
--delete
, ele exclui outros arquivos no lado remoto que não coincidem com o lado local ).fonte