web-dev-qa-db-fra.com

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

J'essaie d'utiliser l'option --delete dans rsync pour supprimer des fichiers du répertoire cible qui ne sont pas présents dans le répertoire d'origine.

Voici la commande que j'utilise:

rsync -avz --ignore-existing --recursive --delete /var/www/* [email protected]:/var/www

Ma question est donc la suivante: comment puis-je supprimer tous les fichiers du répertoire cible qui ne sont pas présents dans le répertoire d'origine?

12
user2028856

Utilisez cette commande:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ [email protected]:/var/www

Vous n'avez pas besoin d'un "*" et vous ne devriez 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*'
13
A.B.

Votre commande ne fonctionnait pas car, lorsque vous utilisiez /var/www/* en tant que source, votre Shell l'exécutait globalement, c.-à-d. Que le Shell étend * à tous les fichiers de ce répertoire et les copiait un par un. Ici, les fichiers individuels sont devenus les sources plutôt que le répertoire parent.

Ainsi, si vous utilisez /var/www/*, vous n'avez pas besoin de l'option --recursive car * provoque la copie des fichiers (ainsi que des répertoires avec leur contenu), pas le répertoire parent qui les contient. Pour la même raison, --delete ne fonctionne pas, car --delete supprimera les fichiers de la destination répertoire qui ne se trouvent pas dans la source répertoire, mais vous copiez des fichiers afin de ne pas les supprimer. (attendu).

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 constater, j’ai utilisé le code source sous la forme /foo/*. Par conséquent, la commande rsync en cours d’exécution est

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

avec * obligeant Shell à le développer et à transformer tous les fichiers individuellement en arguments source, et non pas dans le répertoire parent dans son ensemble (et vous n'avez pas non plus besoin de --recursive dans ce cas).

Donc, si vous voulez que --delete fonctionne, exécutez-le en tant que:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ [email protected]:/var/www/
14
heemayl