Je voudrais utiliser rsync pour ...
- supprimer les fichiers côté réception qui ont également été supprimés côté envoi
- ne supprime pas les autres fichiers qui se trouvent dans le répertoire rsynced côté réception
Par exemple, disons que j'ai un répertoire local-src
:
AVANT: local-src
contient localement ...
a.txt
b.txt
c.txt
mon répertoire distant que je voudrais synchroniser avec le contenu de local-src
s'appelle remote-src
.
AVANT: remote-src
contient à distance ...
a.txt
b.txt
c.txt
d.txt
README.md
Disons que je supprime certains fichiers dans local-src
:
APRÈS SUPPRESSION LOCALE: local-src
contient localement ...
c.txt
Comment puis-je utiliser rsync de manière à garantir que les fichiers supprimés à la source sont également supprimés à la destination, mais sans supprimer d'autres fichiers à la destination. Par exemple, j'aimerais avoir les éléments suivants à destination:
APRÈS EFFACEMENT LOCAL: remote-src
contient à distance ...
c.txt
d.txt
README.md
Autrement dit, a.txt
et b.txt
sont également supprimés à distance, mais d.txt
et README.txt
sont laissés seuls.
Existe-t-il un moyen d'y parvenir avec rsync?
EDIT: Le verdict semble être que cela pourrait être impossible avec rsync. On m'a demandé pourquoi j'avais besoin de cela, alors pour illustrer mon cas d'utilisation:
Disons que j'ai un serveur Web. Sur ce serveur Web, j'ai un tas de répertoires, disons que j'ai un répertoire A
et un public_html
répertoire à partir duquel mon site est servi. Disons que j'ai un processus automatisé qui produit des fichiers dans le répertoire A
. Je voudrais rsync (ou synchroniser en utilisant un autre outil) les fichiers générés ou mis à jour dans A
le public_html
répertoire, sans supprimer d'autres fichiers arbitraires qui pourraient se trouver à l'intérieur public_html
. Je ne veux certainement pas que rsync supprime accidentellement mon site Web.
Si rsync n'est pas l'outil pour ce travail, quelqu'un d'autre sait-il comment je peux le faire?
rsync
car il n'y a aucun moyen de savoir quels fichiers se trouvent déjà dans le dossier distant. Vous devrez peut-être trouver un autre outil.Réponses:
Ce que vous voulez faire est raisonnable, mais
rsync
ne pas le faire seul. La réponse est donc non .La raison est simple:
rsync
ne conserve aucun historique de ce qui était dans chaque répertoire et n'a aucun moyen de savoir ce qui doit être supprimé et ce qui ne l'est pas. Pas sans support supplémentaire.Vous devriez vous demander pourquoi vous aimez faire cela
rsync
et clarifier cela. Il existe d'autres programmes qui utilisentlibrsync1.so
plus intelligents.Avec les contraintes détendues dont vous n'avez pas besoin en
rsync
soi, vous pouvez jeter un œil à rdiff-backup :Cela se voit
xx
etyy
est dansb
.Cela se voit
xx
etzz
est dansb
.rdiff-backup
maintient également un répertoirerdiff-backup-data
enb
sorte que vous pouvez annuler ces modifications, vous devez purger sur une base régulière en utilisant lesrdiff-backup
commandes. (L'exemple est avec des fichiers locaux pour montrer que les données supplémentaires dans la cible ne sont pas supprimées, mais rdiff-backup fonctionne également sur un réseau).Une autre alternative consiste à configurer un système de contrôle de révision distribué (mercurial, bazaar, git). Avec mercurial, par exemple, vous pouvez avoir un script (j'utilise un Makefile pour cela), qui pousse toutes les modifications sur le serveur et fait ensuite une mise à jour des fichiers extraits, ignorez tous les fichiers supplémentaires qui se trouvent sur le serveur distant (mais qui ont pas été soumis au contrôle des révisions).
Sur le serveur, vous feriez:
Sur le client:
Maintenant, si vous supprimez un fichier sur le client et faites:
Votre fichier supprimé est supprimé sur le serveur, mais aucune autre donnée (non ajoutée au référentiel) n'est supprimée.
la source
A
, où certains processus sont automatisés et les fichiers y sont générés automatiquement. J'ai un serveur Web et j'aimerais que les fichiersA
qu'ils contiennent soient synchronisés avec lepublic_html
répertoire du serveur Web, bien sûr sans supprimer tout le reste dupublic_html
dossier du serveur Web. Si quelqu'un a des idées pour y parvenir avec un autre outil, ce serait plus que bienvenu. Je mettrai à jour ma question pour refléter cela.local-src
répertoire sans qu'un processus ne surveille ce répertoire pour les changements. Ce serait peut-être difficile.rsync
n'est pas l'outil. S'il vous plaît se rendre compte quesync
dansrsync
vient de synchronisation et ce n'est pas exactement ce que vous voulez faire. Dans le développement dersync
l'accent a été mis sur l'efficacité (minimiser) le transfert de données. D'autres outils commerdiff-backup
(et possiblescvsup
) ont utilisé ses techniques pour cela, mais s'appuient sur lui avec des fonctionnalités supplémentaires.Je ne pense pas que cela soit possible sans exclure explicitement les fichiers du côté réception dans le cadre de la commande rsync. Consultez la section de la page de manuel pour rsync: "RÈGLES PAR RÉPERTOIRE ET SUPPRIMER".
la source
Si j'ai bien compris, c'est
--exclude
peut-être ce que vous cherchez:la source
J'ai une réponse à cela. Je pense que ça marche. Et cela fonctionne pour moi . Vous devez d'abord avoir à
rsync
distance des fichiers vers des fichiers locaux. Ensuite, le côté local contient tous les fichiers.maintenant côté local
Ensuite, vous pouvez supprimer les fichiers ou faire ce que vous voulez (côté local). Dans votre question, vous supprimez ces fichiers.
fichiers supprimés
Après cela, vous pouvez
rsync
créer des fichiers locaux sur le côté distant.il donne
fichiers du côté distant et du côté local (en utilisant
--delete
, il supprime les autres fichiers du côté distant qui ne correspondent pas au côté local ).la source