Удивительно, но ни один ответ через 6 лет не использует эту -i
опцию или не дает хорошего результата, так что я пойду:
TLDR - просто покажи мне команды
rsync -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
rsync -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
rsync -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Понимание вывода
Вот пример вывода:
L file-only-in-Left-dir
R file-only-in-right-dir
X >f.st...... file-with-dif-size-and-time
X .f...p..... file-with-dif-perms
Обратите внимание на первый символ каждой строки:
L
/ R
означает, что файл / dir появляется только в L
eft или ight R
dir.
X
означает , что с обеих сторон появляется файл , но это не то же самое (в этом случае следующие 11 символов дать вам больше информации. s
, t
и p
показывают различия в ы Изе, т IME и р ermissions соответственно - для получения дополнительной информации попробуйте man rsync
и поиск --itemize-changes
) ,
Дополнительные опции, которые вы можете использовать
Если вы также хотите сравнить владельца / группу / права доступа к файлам, добавьте опции -o
/ -g
/ -p
соответственно. В заключение отметим, что по умолчанию rsync считает два файла одинаковыми, если они имеют одинаковое имя, время и размер. Это очень быстро и в большинстве случаев более чем достаточно, но если вы хотите быть на 100%, добавьте -c
также, чтобы сравнить содержимое файлов с тем же именем, временем и размером.
TLDR - просто дай мне сценарий, чтобы позвонить
Вот. Назови это так
diff-dirs Left_Dir Right_Dir [options]
Все опции, упомянутые выше в разделе «Дополнительные опции, которые вы можете использовать», также применимы и здесь.
#!/bin/bash
# Compare two directories using rsync and print the differences
# CAUTION: options MUST appear after the directories
#
# SYNTAX
#---------
# diff-dirs Left_Dir Right_Dir [options]
#
# EXAMPLE OF OUTPUT
#------------------
# L file-only-in-Left-dir
# R file-only-in-right-dir
# X >f.st...... file-with-dif-size-and-time
# X .f...p..... file-with-dif-perms
#
# L / R mean that the file/dir appears only at the `L`eft or `R`ight dir.
#
# X means that a file appears on both sides but is not the same (in which
# case the next 11 characters give you more info. In most cases knowing
# that s,t,T and p depict differences in Size, Time and Permissions
# is enough but `man rsync` has more info
# (look at the --itemize-changes option)
#
# OPTIONS
#---------
# All options are passed to rsync. Here are the most useful for the purpose
# of directory comparisons:
#
# -c will force comparison of file contents (otherwise only
# time & size is compared which is much faster)
#
# -p/-o/-g will force comparison of permissions/owner/group
if [[ -z $2 ]] ; then
echo "USAGE: $0 dir1 dir2 [optional rsync arguments]"
exit 1
fi
set -e
LEFT_DIR=$1; shift
RIGHT_DIR=$1; shift
OPTIONS="$*"
# Files that don't exist in Right_Dir
rsync $OPTIONS -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
# Files that don't exist in Left_Dir
rsync $OPTIONS -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
# Files that exist in both dirs but have differences
rsync $OPTIONS -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Как это работает?
Мы называем rsync следующим образом:
rsync -rin ...
Мы используем -i
( --itemize-changes
), чтобы сообщить rsync о выводе одной строки вывода для каждого файла, который содержит информацию о любых различиях между двумя каталогами. Нам нужно -n
подавить нормальное поведение rsync (то есть попытаться синхронизировать два каталога путем копирования / удаления файлов). нам также нужно -r
работать рекурсивно для всех файлов / подкаталогов.
Мы вызываем rsync три раза:
1-й вызов : распечатать файлы, которые не существуют в Dir_B. Нам нужно использовать, --ignore-existing
чтобы игнорировать файлы, которые существуют с обеих сторон.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
2-й вызов : точно так же, как и раньше, но мы меняем порядок DIR_A / DIR_B.
3-й вызов : наконец, мы используем --existing
только для проверки файлов, которые появляются в обоих каталогах.
rsync -rin --existing $DIR_A/ $DIR_B/