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

28

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' --forceoption 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.

Mise à jour: ajoutée sudoà la commande pour indiquer clairement qu'il ne s'agit pas d'un problème d'autorisations de fichiers.

tommarshall
la source
Quel système de fichiers est la destination? Le système de fichiers a-t-il besoin d'être réparé?
Marcus Downing
Le système de fichiers est ext3. Il est possible que le système de fichiers ait besoin ou soit réparé. Je vais fsckà la prochaine occasion et mettre à jour avec les résultats.
tommarshall
Je viens fsckdu système et ce problème est toujours présent.
tommarshall

Réponses:

39

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

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

Martin Höger
la source
Il y avait un dossier appelé uploadsdans les html/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_sampleset les html/js/ckeditor/plugins/uicolor/yuirépertoires. Merci de votre aide.
tommarshall
si vous utilisez --delete-excludedmais que vous souhaitez toujours exclure certains fichiers / répertoires de la suppression, vous pouvez placer ce fichier / répertoire --filter 'protect some_dir/', par exemple:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985
6

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", à n'importe quel niveau 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 /"

user3586623
la source
0

Dans ma configuration ((la source est le format Ubuntu de type 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
En loi
la source
2
Quelle partie de cela résout réellement le problème?
Michael Hampton
0

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

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

mivk
la source
-1

Un répertoire doit être vide pour que vous puissiez le supprimer, le système de fichiers l'exige normalement.

Par conséquent, normalement rsyncou rmsupprimerait récursivement tout le contenu en premier et ensuite seulement le répertoire désormais vide.

Si l'utilisateur actuel n'est pas le propriétaire de tous les fichiers, les autorisations des systèmes de fichiers ne vous permettront pas de supprimer ces fichiers. Puisqu'ils ne seront pas supprimés, le répertoire n'est pas vidé et la suppression échouera.

Ma première supposition serait que certains fichiers de ces répertoires appartiennent à un autre utilisateur, par exemple les utilisateurs d'apache ou de personne.

HBruijn
la source
Merci. Les fichiers dans les répertoires appartiennent en effet à un utilisateur du groupe apache, mais je viens d'essayer d'exécuter cette commande en tant que cet utilisateur et j'ai les mêmes erreurs.
tommarshall
De plus, s'il s'agissait d'un problème d'autorisations de fichiers, je m'attendrais à exécuter la même commande qu'avec 'sudo' pour résoudre le problème, mais ce n'est pas le cas. Cependant, veuillez me corriger si je me trompe.
tommarshall
1
L'exécution de la commande en tant que root devrait résoudre la plupart des problèmes d'autorisation, oui. (l'endroit probable où cela échouerait toujours est sur un montage nfs pour en nommer un, un fichier immuable un autre) Une simple vérification avec ls -lapour voir pourquoi le répertoire n'est toujours pas vide. lsattraffichera des fichiers immuables.
HBruijn
Merci pour les informations supplémentaires, cependant à lsattrpartir de l'un des répertoires répertoriés, les résultats suivants: --------------- ./assets(pas d'indicateur i), et le fichier n'est pas sur un montage nfs. Y a-t-il d'autres raisons pour lesquelles vous pourriez penser que la commande échouerait toujours avec sudo?
tommarshall
Y a-t-il des liens symboliques dedans, ou juste de vrais fichiers?
Marcus Downing