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?
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*'
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/