web-dev-qa-db-fra.com

Comment imprimer des fichiers qui auraient été modifiés avec rsync?

Existe-t-il un moyen de faire en sorte que rsync imprime les chemins d'accès complets à tous les fichiers différents sans transférer aucun fichier?

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

30
Joe Tsai

Rsync a une option dry-run:

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

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

Si vous voulez diff les fichiers sur deux arborescences, vous pouvez peut-être effectuer une recherche récursive dans les deux directions avec find et pipe pour générer une sortie vers ls et les diriger vers un fichier. Vous pouvez ensuite utiliser diff pour comparer les fichiers.

30
Vincent

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

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

rsync -rvn localdir targetdir

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

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

6
Hugo Zaragoza

S'appuyant sur d'autres réponses et https://serverfault.com/a/618740/114520

  • utilisez --dry-run (ou -n) pour éviter les modifications
  • utiliser --itemize-changes (ou -i) pour rechercher les modifications
  • utilisez --archive (ou -a) pour obtenir tous les sous-répertoires
  • utilisez egrep pour filtrer les entrées commençant par un point (aucun changement)

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

Si vous voulez juste une façon, vous pouvez changer la commande:

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

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

0
Yvan

Je voudrais 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

En réalité, si vous exécutez rsync -v ... et que le nom du fichier est affiché à l'écran, ce fichier est en cours de transfert (ou aurait été transféré si - -dry-run). Pour déterminer pourquoi rsync était sur le point de le transférer, utilisez le mode itemize: https://serverfault.com/a/618740/27813

Comme d'autres l'ont noté, par défaut, rsync compare uniquement la taille et l'horodatage du fichier, 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".

0
rogerdpack