Comment imprimer des fichiers qui auraient été modifiés à l'aide de rsync?

32

Existe-t-il un moyen d'obtenir rsync pour imprimer les chemins de fichiers complets vers tous les fichiers qui sont différents sans réellement transférer de fichiers?

Alternativement, j'ai besoin d'un moyen de différencier les fichiers sur deux arbres (via SSH) en fonction uniquement du changement de taille ou de la dernière modification.

Joe Tsai
la source

Réponses:

33

Rsync a une dry-runoption:

-n, --dry-run               show what would have been transferred

Je ne sais pas si c'est ce que vous voulez.

Si vous voulez diffles fichiers à travers deux arborescences, vous pouvez peut-être rechercher récursivement les deux directions avec find et pipe pour sortir vers ls et diriger les deux vers un fichier. Vous pouvez ensuite utiliser diffpour comparer les fichiers.

Vincent
la source
3
+1, ceci est intégré à rsync. Le détail de la sortie de --dry-rundépendra de votre utilisation de -vet --progress options- donc si vous n'obtenez aucune sortie, vérifiez que ces options sont définies selon les besoins. J'ai remarqué qu'il enverra des noms de répertoire même lorsque les fichiers n'ont pas changé, mais vous pouvez les filtrer en passant la sortie sedou similaire.
David Spillett
4
Mais --dry-run semble montrer les fichiers même s'ils sont identiques.
Quantum7
14

Je préfère utiliser le format --out pour voir les détails, en le redirigeant vers moins:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
kabZX
la source
7

rsync -rvn localdir targetdir

Le -n signifie afficher uniquement les actions (sans qu'aucune action ne soit exécutée).

Notez que vous avez besoin du 'v' ou il ne vous montrera rien! (le reste des réponses l'oublie ...)

Hugo Saragosse
la source
2
Pour les abonnés, -n est équivalent à "--dry-run" :)
rogerdpack
1

S'appuyant sur d'autres réponses et /server//a/618740/114520

  • utiliser --dry-run(ou -n) pour éviter toute modification
  • utiliser --itemize-changes(ou -i) pour trouver des changements
  • utiliser --archive(ou -a) pour obtenir tous les sous-répertoires
  • utiliser egreppour filtrer les entrées commençant par un point (pas de changement)

Ce qui vous donne: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Si vous ne voulez qu'une seule façon, vous pouvez changer la commande:

  • pour les changements de la source à la destination: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • pour les changements de destination à source: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

Et si vous n'avez besoin que des fichiers, ajoutez simplement de la awkmagie:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

Yvan
la source
0

J'irais pour quelque chose comme ça:

#! /bin/bash 

set -eu   ## Stop on errors and on undefined variables

## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2

shift 
shift 
# Now the first two args are gone and any other remaining arguments, if any, 
# can be expanded with $* or $@

# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d  "$PWD/XXXXXXX.tmp" )"

# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT

# Make a *hard-linked* copy of our repository. It uses very little space 
# and is very quick 
cp -al "$LOCAL_DIR" "$tmpd"

# Copy the files. The final «"$@"» allows us to pass on arguments for rsync 
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/   "$tmpd/"  --size-only "$@"

# Compare both trees
meld "$LOCAL_DIR"  "$tmpd"

Par exemple:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Raúl Salinas-Monteagudo
la source
0

La vérité est que si vous exécutez rsync -v ...et qu'il affiche un nom de fichier à l'écran, ce fichier est en cours de transfert (ou aurait été transféré, si vous effectuez un --dry-run). Pour savoir pourquoi rsync était sur le point de le transférer, utilisez le mode de détail: /server//a/618740/27813

Comme d'autres l'ont noté, par défaut, rsync compare uniquement en fonction de la taille du fichier et de l'horodatage, qui doivent tous deux correspondre, sinon une "copie delta" est démarrée sur ce fichier. Si vous voulez vraiment voir quels fichiers sont différents, utilisez le mode de somme de contrôle "-c".

rogerdpack
la source