rsync ne peut pas supprimer le répertoire non vide

10

Lors de la synchronisation de ma sauvegarde à distance, j'obtiens l'erreur rsync cannot delete non-empty directory.

Je connais la cause: j'ai exclu certains fichiers et lorsque rsync essaie de supprimer un répertoire distant car il n'existe pas localement, il ne peut pas car il n'est pas vide. Sans l'exclusion, l'annuaire serait vidé.

Je sais également que je pourrais me débarrasser du problème en utilisant --delete-exclus, mais ce n'est pas ce que je veux.

Je voudrais ignorer le téléchargement de certains fichiers (car ils sont trop gros pour ma vitesse de téléchargement), mais je veux conserver ceux que j'ai déjà téléchargés il y a quelque temps s'ils existent localement . S'ils n'existent pas localement, ils doivent être supprimés. --delete-exclus les supprimerait tous du côté distant.

Cela signifie également que si un répertoire n'existe plus localement, il doit être supprimé même s'il contient des fichiers exclus.

Est-il possible de configurer rsync pour y parvenir?

marlar
la source

Réponses:

5

Utilisez le pmodificateur:

Un p indique qu'une règle est périssable, ce qui signifie qu'elle est ignorée dans les répertoires en cours de suppression. Par exemple, les règles par défaut de l'option -C qui excluent des choses comme "CVS" et "* .o" sont marquées comme périssables et n'empêcheront pas un répertoire qui a été supprimé sur la source d'être supprimé sur la destination.

Par exemple, j'utilise l' -Foption qui "indique à rsync de rechercher les fichiers .rsync-filter par répertoire qui ont été dispersés dans la hiérarchie et d'utiliser leurs règles pour filtrer les fichiers lors du transfert".

My .rsync-filtercontient des lignes comme celles-ci pour filtrer ces "excréments" que les Mac laissent derrière eux:

-p .DS_Store
-p ._*

Si vous utilisez excludeau lieu de simplement -, ajoutez une virgule. Par exemple :

exclude,p .DS_Store
exclude,p Thumbs.db
mivk
la source
0

Vous pouvez utiliser des modificateurs de modèle d'inclusion / exclusion, des ajouts sur le modèle que vous avez utilisé. Il indique à rsync qui exclut la règle uniquement pour le côté envoi.

-n: ne vérifie que ce qui sera supprimé lors de la desc, ne supprime pas le motif: * .sh desc: / home / kg / tmp

objectif: vouloir supprimer la fin du fichier .sh sur desc, mais si vous faites cela, vous ne pouvez pas supprimer sur le desc: rsync -rvz --exclude * .sh --delete -n conkg [email protected]: / maison / kg / tmp

devrait changer en: veuillez ajouter -n lorsque vous testez le test: rsync -rvz --exclude-from del.txt -n --delete conkg [email protected]: / home / kg / tmp suppression réelle: rsync -rvz - exclude-from del.txt --delete conkg [email protected]: / home / kg / tmp cat del.txt -s * .sh

ou: rsync -rvz --exclude -s * .sh --delete conkg [email protected]: / home / kg / tmp

kg deng
la source
-2

utilisez simplement les options «--max-size = xx» et «--delete» de rsync. Il fera tout automatiquement et répondra à toutes vos exigences.

sparkie
la source
Ce serait tout au plus une solution de contournement. Je veux ignorer complètement les fichiers mov, avi et cr2 car ils sont généralement très volumineux. Mais ceux que j'ai déjà téléchargés sur une ligne plus rapide il y a quelque temps devraient être conservés. Maintenant, le problème est que les plus gros fichiers JPG sont plus gros que les plus petits fichiers CR2, donc cette solution n'est pas idéale. Je préfère utiliser la fonction d'exclusion pour filtrer les noms de fichiers.
marlar