Como fazer RSYNC em um único arquivo?


94

Atualmente, eu só faço RSync Directoriescomo:

* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html

Então, como faço para rsyncum único arquivo, como /var/www/public_html/.htaccess?

Respostas:


158

Você faz isso da mesma forma que faria com um diretório, mas especifica o caminho completo para o nome do arquivo como a fonte. No seu exemplo:

rsync -avz   --progress  /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/

19
Além disso, se estiver enviando apenas um arquivo, você pode adicionar o parâmetro "--progress" para que possa observar o andamento.
JoshStrange

isso significa que você ainda precisa de um módulo em rsyncd.conf com um diretório acima do arquivo (por exemplo, com a opção recusar excluir), ou você pode enviar arquivos para qualquer lugar no servidor apenas especificando seu caminho? A página do manual não é muito clara sobre isso.

2
-a inclui recursivo e isso não é necessário para um único arquivo, não tenho certeza se eu usaria esse sinalizador para um único arquivo, pois pode levar a um comportamento não intencional se o nome do arquivo por acidente se tornar um diretório.
redanimalwar,

2
--partial --stats --progress << Esses sinalizadores são úteis se for um arquivo muito grande e pode ter que ser reiniciado após uma transferência interrompida.
Ahi Tuna


14

A resposta de Michael Place funciona muito bem se, em relação ao diretório raiz da origem e do destino, todos os diretórios no caminho do arquivo já existem.

Mas e se você quiser sincronizar um arquivo com este caminho de origem:

/ source-root / a / b / arquivo

para um arquivo com o seguinte caminho de destino:

/ target-root / a / b / arquivo

e os diretórios um e b não existe?

Você precisa executar um comando rsync como o seguinte:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]

2
Não seria mais seguro apenas copiar o arquivo individual para uma pasta existente ou criar as pastas com antecedência? No caso de sincronização de pasta ou conteúdo de pasta, vamos rsync criar todas as subpastas, afinal é seu trabalho, mas neste caso particular é muito incômodo e complicado os parâmetros --include apenas para copiar arquivos individuais.
Tulains Córdova

@ user1598390 Não tenho certeza de qual cenário você está assumindo, ou imaginando, em que isso seria menos seguro, mas se você estava tentando se lembrar da forma específica deste comando e não o fazia com frequência, então sim, provavelmente menos seguro do que copiar o arquivo único. Pode ser mais seguro se o arquivo for grande, ou seja, porque o rsync trata automaticamente a maioria dos erros que podem ocorrer durante a cópia. Para algum contexto, minha sintaxe foi particularmente útil para mim porque eu tinha escrito o código que gerava comandos neste formato, então, dados testes suficientes cobrindo o código relevante, esses comandos são 'seguros'.
Kenny Evitt

0

Até agora, duas das respostas não estão certas, eles obterão mais de um arquivo, e o outro não é tão simples quanto poderia ser, aqui está uma resposta mais simples IMO.

O seguinte obtém exatamente um arquivo, mas você deve criar o diretório dest com mkdir. Esta é provavelmente a opção mais rápida:

mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/

Se houver apenas uma instância do arquivo em / remote / path, o rsync pode criar diretórios para você se você fizer o seguinte. Isso provavelmente levará um pouco mais de tempo porque pesquisa mais diretórios. Além disso, criará diretórios vazios para diretórios em / remote / path que não estão em ./local

cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .

Tenha em mente que a ordem de --include e --exclude é importante.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.