web-dev-qa-db-fra.com

Les erreurs rsync «ne peuvent pas supprimer le répertoire non vide», même avec l'option --force

Lors de l'exécution de cette commande:

$ Sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

J'obtiens la sortie suivante:

cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor

En lisant le man rsync, J'ai eu l'impression que l'option --force Dirait à rsync de supprimer ces répertoires non vides, ce qui est le résultat souhaité.

Réf:

--force                 force deletion of dirs even if not empty

Comment puis-je modifier la commande pour supprimer les répertoires non vides?

J'utilise rsync version 3.0.8, sur Gentoo Base System version 2.0.3, au cas où cela serait pertinent.

pdate: Ajout de Sudo à la commande pour indiquer clairement qu'il ne s'agit pas d'un problème d'autorisations de fichiers.

29
tommarshall

Avez-vous essayé d'ajouter --delete-excluded?

Si vous supprimez un répertoire de vos dossiers exclus du côté "distant", rsync --delete ne supprimera pas le dossier exclu de votre site "local".

42
Martin Höger

Voici les sources possibles de ce problème:

(1) Cette erreur peut être le résultat de l'option - b (--backup). Cette option créera une sauvegarde de chaque fichier supprimé, en ajoutant un tilde (~) sur son nom de fichier. (Cela m'a dérouté, car le nom de fichier est clairement une sauvegarde, mais le nom du répertoire ne l'est pas, car vous ne pouvez pas voir le tilde.)

Pour vérifier s'il s'agit du même cas, lisez votre répertoire cible au niveau le plus profond et vérifiez s'il existe un fichier de fin tilde (~). Notez que ces noms de fichiers ajoutés au tilde sont alors invisibles dans certains systèmes de navigation de fichiers courants, de sorte que vous ne les verrez peut-être pas.

Pour résoudre ce cas, préférez l'option --backup-dir = DIR, par exemple --backup-dir = .rsync_bak.

(2) L'option --exclude peut avoir les mêmes résultats. Ce qui se produit peut-être dans votre cas. Le système de modèle est puissant, mais peut être trompeur. Par exemple, si vous écrivez --exclude = '* ~', cela sautera tous les fichiers de fin de tilde, résultant exactement comme dans le cas (1) ci-dessus.

à partir de la page de manuel de rsync:

si le modèle commence par un/alors il est ancré à un endroit particulier dans la hiérarchie des fichiers, sinon il est comparé à la fin du chemin

Si vous écrivez --exclude = uploads, cela exclura tous les fichiers nommés "updloads", au niveau any de votre arborescence de fichiers.

Vérifiez s'il y a un fichier nommé "uploads" dans vos répertoires impossibles à supprimer.

La solution serait de remplacer "--exclude = uploads" par "--exclude = uploads /"

6
user3586623

Utilisez des règles dans les fichiers de filtre au lieu de --exclude. Ceux-ci vous permettent de marquer les exclus comme "persistant", ce qui vous permettra de supprimer les répertoires non vides qui contiennent des fichiers exclus.

Voir cette réponse pour plus de détails.

0
mivk

Dans ma configuration ((la source est le type de format Ubuntu ext4 pour cibler le fusible de type Western Digital), il fonctionne avec:

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
0
InLaw