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.
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.
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
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 ...)
S'appuyant sur d'autres réponses et https://serverfault.com/a/618740/114520
--dry-run
(ou -n
) pour éviter les modifications--itemize-changes
(ou -i
) pour rechercher les modifications--archive
(ou -a
) pour obtenir tous les sous-répertoiresegrep
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:
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
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}'
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".