Supprimer les fichiers superflus du répertoire de destination via rsync?

51

Dis que j'ai

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Il ne supprime pas hello.jpg de DEST, aucune idée de comment archiver cela?

Cheng
la source

Réponses:

72

La raison pour laquelle votre commande ne fonctionne pas est expliquée par la page de manuel relative à rsync (italique ajouté):

--effacer

Cela indique à rsync de supprimer les fichiers superflus du côté de la réception (ceux qui ne sont pas du côté de l'envoi), mais uniquement pour les répertoires en cours de synchronisation. Vous devez avoir demandé à rsync d’envoyer l’ensemble du répertoire (par exemple, "dir" ou "dir /") sans utiliser de caractère générique pour le contenu du répertoire (par exemple, "dir / *") car le caractère générique est développé par le shell et rsync demande de transfert de fichiers individuels, pas du répertoire parent des fichiers. Les fichiers exclus du transfert sont également exclus de la suppression, sauf si vous utilisez l'option --delete-excluded ou marquez les règles comme ne faisant que correspondre uniquement du côté de l'envoi (voir les modificateurs d'inclusion / exclusion dans la section RÈGLES DU FILTRE).

Ainsi, quand vous courez

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

les fichiers non désirés dans DEST ne sont pas supprimés car vous n'avez pas demandé de répertoire à synchroniser, mais uniquement une poignée de fichiers spécifiques. Pour obtenir les résultats souhaités, essayez quelque chose comme ceci:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Notez que l'ordre des directives d'inclusion et d'exclusion est important. Essentiellement, chaque fichier est comparé aux modèles d'inclusion ou d'exclusion dans l'ordre dans lequel ils apparaissent. Ainsi, les fichiers avec les extensions .jpg ou .txt sont synchronisés dans la mesure où ils correspondent aux modèles "inclus" avant de correspondre au modèle "*" exclu. Tout le reste est exclu par le --exclude '*'motif. Cette --delete-excludedoption garantit que même les fichiers exclus du côté DEST sont supprimés.

Steven D
la source
@Cheng, tu veux expliquer un peu plus? Je serais heureux de mettre à jour ma réponse s'il y a un problème / une amélioration.
Steven D
Ça marche. Je suppose. Les choses de processus me déroutent, me font penser qu'il a été transféré à nouveau.
Cheng
J'ai modifié ma réponse pour expliquer un peu plus.
Steven D
2
@Cheng: Je suppose que vous ne voulez pas le --delete-excluded. Sans cela, seuls *.jpget *.txtpeuvent être supprimés du côté de la destination. Avec lui, les fichiers non liés seraient également supprimés. Vous pouvez être intéressé par ce tutoriel sur les filtres rsync .
Gilles 'SO- arrête d'être méchant'
3
Merci! Pour moi, il me manquait la barre oblique de fin sur le répertoire source.
vaughan