L'option Rsync --delete ne supprime pas les fichiers du répertoire cible

14

J'essaie d'utiliser l' --deleteoption rsyncpour supprimer des fichiers dans le répertoire cible qui n'est pas présent dans le répertoire d'origine

Voici la commande que j'utilise:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Donc ma question est, comment puis-je supprimer tous les fichiers du répertoire cible qui ne sont pas présents dans le répertoire d'origine?

user2028856
la source

Réponses:

14

Utilisez cette commande:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Vous n'avez pas besoin d'un "*" et ne devez pas l'utiliser aussi.

Pour exclure / inclure des fichiers ou des répertoires, vous devez utiliser ces paramètres:

--exclude 'to_exclude*'
--include 'to_include*'
UN B
la source
D'accord, laissez-moi essayer :)
user2028856
2
Le "*" provoque-t-il que la commande --delete ne fonctionne pas?
user2028856
2
Voilà à quoi ça ressemble. :)
AB
3
--recursiveest surabondant car l'option l' -ainclut déjà
Temak
1
Le "*" peut être important dans certains cas car il exclut les fichiers / répertoires commençant par ".". Par exemple, je l'utilise lorsque j'utilise rsync pour copier un répertoire maintenu sous git d'une machine de développement vers une machine de production. Je ne veux pas synchroniser le répertoire du référentiel .git, ou des fichiers comme .gitignore, juste l'arborescence de travail, y compris les fichiers au niveau supérieur ainsi que les sous-répertoires.
sootsnoot
14

Votre commande ne fonctionnait pas parce que lorsque vous l'utilisiez /var/www/*comme source, votre shell y effectuait une globalisation, c'est-à-dire que le shell se développait *sur tous les fichiers de ce répertoire et copiait les fichiers un par un, donc ici les fichiers individuels sont devenus les sources plutôt que le répertoire parent.

Donc, si vous utilisez /var/www/*, alors vous n'avez pas besoin d' --recursiveoption car *cela entraînera la copie des fichiers (avec tous les répertoires avec leur contenu), pas le répertoire parent qui contient les fichiers. En raison de la même raison --deletene fonctionne pas, comme --deletesupprimera les fichiers de destination répertoire qui ne sont pas dans la source répertoire , mais vous copiez des fichiers si ses fichiers (pas la suppression expectedly).

Cela vous rendra plus clair:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Comme vous pouvez le voir, j'ai utilisé la source car /foo/*la rsynccommande en cours d'exécution est

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

avec *faire shell pour le développer et faire tous les fichiers individuellement comme arguments source, pas le répertoire parent dans son ensemble (et vous n'avez pas non plus besoin --recursivedans ce cas).

Donc, si vous voulez faire du --deletetravail, exécutez-le en tant que:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/
heemayl
la source
4
Excellente explication soulignant le vrai problème: utiliser '*' pour développer la liste des sources.
Antonio Bardazzi
Comme indiqué dans mon commentaire sur la réponse acceptée, le * peut être utile pour exclure des choses comme les fichiers et les répertoires commençant par ".". Bien que, comme vous le constatez, cela signifie que les fichiers et répertoires supprimés du niveau supérieur dans la source ne seront pas supprimés du répertoire de destination. Pour moi, je me fiche que les fichiers de niveau supérieur soient correctement supprimés de la destination, seuls les fichiers en dessous des sous-répertoires comptent. La suppression d'un sous-répertoire de niveau supérieur est beaucoup moins probable que l'ajout d'un, et je suis prêt à faire un rm -r manuel sur la destination dans ce cas peu probable.
sootsnoot