28

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

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

5 ответов5

28

Rsync имеет опцию пробного dry-run :

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

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

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

13

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

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

rsync -rvn localdir targetdir

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

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

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 собирался передать его, используйте режим детализации: https://serverfault.com/a/618740/27813

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .