Как распечатать файлы, которые были бы изменены с помощью rsync?

32

Есть ли способ заставить rsync напечатать полные пути к файлам для всех файлов, которые отличаются друг от друга, без фактической передачи каких-либо файлов?

В качестве альтернативы мне нужен способ разбить файлы по двум деревьям (по SSH), основываясь только на изменении размера или времени последнего изменения.

Джо Цай
источник

Ответы:

33

Rsync имеет dry-runопцию:

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

Я не уверен, что это то, что вы хотите.

Если вы хотите, чтобы diffфайлы проходили через два дерева, вы можете рекурсивно искать в двух направлениях команду find и pipe для вывода в ls и передачи обоих в файл. Затем вы можете использовать diffдля сравнения файлов.

Винсент
источник
3
+1, это встроено в rsync. Детали вывода --dry-runбудут зависеть от того, как вы используете -vи --progress options- так что, если вы вообще ничего не выводите, проверьте, что эти опции установлены по мере необходимости. Я заметил, что он будет отправлять имена каталогов, даже если файлы не изменились, но вы можете отфильтровать их, пропустив выходные данные sedили аналогичные.
Дэвид Спиллетт
4
Но --dry-run, кажется, показывает файлы, даже если они идентичны.
Quantum7
14

Я предпочитаю использовать --out-формат, чтобы увидеть подробности, передавая его меньше:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
kabZX
источник
7

rsync -rvn localdir targetdir

-N означает показывать только действия (без каких-либо действий).

Обратите внимание, что вам нужна буква «v», иначе она вам ничего не покажет! (остальные ответы забывают об этом ...)

Уго Сарагоса
источник
2
Для подписчиков -n эквивалентно "--dry-run" :)
rogerdpack
1

Опираясь на другие ответы и /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}'

Yvan
источник
0

Я бы пошел на что-то вроде этого:

#! /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
Рауль Салинас-Монтеагудо
источник
0

Правда заключается в том, что при запуске rsync -v ...и выводит имя файла на экран, то этот файл будет переносится (или был бы передан, если вы делаете --dry-бег). Чтобы выяснить, почему rsync собирался передать его, используйте режим детализации: /server//a/618740/27813

Как отмечали другие, по умолчанию rsync сравнивает только размер файла и временную метку, которые должны совпадать, иначе в этом файле запускается «дельта-копия». Если вы действительно хотите увидеть, какие файлы отличаются, используйте режим контрольной суммы "-c".

rogerdpack
источник