Відповіді:
У Rsync є dry-run
можливість:
-n, --dry-run show what would have been transferred
Я не впевнений, чи цього ви хочете.
Якщо ви хочете, щоб diff
файли знаходилися через два дерева, можливо, ви можете рекурсивно шукати два напрямки з пошуку та трубою для виведення до ls та передачі обох у файл. Потім ви можете використовувати diff
для порівняння файлів.
rsync -rvn localdir targetdir
-N означає показувати лише дії (без виконання будь-яких дій).
Зауважте, що вам потрібне 'v', інакше воно нічого не покаже! (решта відповідей забувають це ...)
На основі інших відповідей та /server//a/618740/114520
--dry-run
(або -n
), щоб уникнути модифікацій--itemize-changes
(або -i
), щоб знайти зміни--archive
(або -a
), щоб отримати всі підкаталогиegrep
для фільтрації записів, починаючи з крапки (без змін)Що дає вам: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."
Якщо ви хочете лише один спосіб, ви можете змінити команду:
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"
А якщо вам потрібні лише файли, просто додайте awk
магію:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'
Я б хотів щось подібне:
#! /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"
Наприклад:
$ cd svn
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Правда полягає в тому, що при запуску rsync -v ...
і виводить ім'я файлу на екран, то цей файл буде переноситься (або був би переданий, якщо ви робите --dry-бег). Щоб з’ясувати, чому rsync збирався перенести його, скористайтеся режимом деталізації: /server//a/618740/27813
Як зазначали інші, rsync за замовчуванням просто порівнює на основі розміру файлу та часової позначки, які обоє повинні відповідати іншому, в цьому файлі запускається "дельта копія". Якщо ви дійсно хочете побачити, які файли відрізняються, використовуйте режим контрольної суми "-c".
--dry-run
буде залежати від вашого використання-v
та--progress options
- тому якщо у вас взагалі немає результату, перевірте, що ці параметри встановлені за необхідності. Я помітив, що він надсилатиме імена каталогів, навіть коли файли не змінені, але ви можете їх відфільтрувати, пропустивши висновок черезsed
або подібне.