Можно ли сравнить две директории с rsync и вывести только различия? Есть вариант пробного запуска, но когда я увеличиваю детализацию до определенного уровня, показывается каждый сравниваемый файл.
ls -alR
и diff
здесь не вариант, поскольку в источнике есть жесткие ссылки, делающие каждую строку разной. (Конечно, я мог бы удалить этот столбец с помощью Perl.)
Ответы:
Вероятно, вам придется бежать что-то вроде
rsync -avun --delete
в обоих направлениях.Но чего вы на самом деле пытаетесь достичь?
Обновление :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
выдаст список файлов, которые не существуют в target-каталоге."grep delet", потому что каждая строка печатает: delet ing ..file ..
rsync -avun $SOURCE $TARGET
выдаст вам список «разных» файлов (включая новые файлы).источник
Чтобы добавить ответ Нильса (для всех, кто сталкивался с этим через Google), по умолчанию
rsync
сравниваются только размеры файлов и время модификации, чтобы определить, есть ли различия. (Если они отличаются, это делает больше, но если они одинаковы, это останавливается там.)Если вы хотите сравнить фактическое содержимое файла , даже для файлов, которые имеют одинаковый размер и время последнего изменения, добавьте флаг,
-c
чтобы сказать,rsync
чтобы сравнивать файлы, используя контрольную сумму.(Эта
-u
опция указывает rsync игнорировать файлы, которые новее,$TARGET
чем те$SOURCE
, которые вам, вероятно, не нужны, если вы сравниваете содержимое.)источник
--no-group --no-owner --no-perms --no-times
или их комбинацию в зависимости от ваших потребностей.-a
вместо-a
, например,rsync -rlDcnv --delete $SOURCE $TARGET
--delete
в список только файлы, существующие в$TARGET
Просто для тех, кто менее знаком с
rsync
:-n
: самое главное - ничего не менять;-rc
: сравнивайте только содержимое (иначе используйте-ac
);-v
: список файлов)--delete
: ищите симметричную, а не однонаправленную разницу./
означает «заглянуть внутрь каталога и сравнить его содержимое с местом назначения».PS. Я знаю, что это ужасный PS - но он действительно был добавлен в спешке. Тем не менее, держу пари, что это может оказаться полезным.
PPS. В качестве альтернативы можно также сделать
Если имена файлов не содержат символов новой строки, мы можем отсортировать как
*.md5
файлы, так иdiff
их. (Однако это будет работать только для файлов; то есть пустой каталог с обеих сторон не будет обнаружен.)источник
Удивительно, но ни один ответ через 6 лет не использует эту
-i
опцию или не дает хорошего результата, так что я пойду:TLDR - просто покажи мне команды
Понимание вывода
Вот пример вывода:
Обратите внимание на первый символ каждой строки:
L
/R
означает, что файл / dir появляется только вL
eft или ightR
dir.X
означает , что с обеих сторон появляется файл , но это не то же самое (в этом случае следующие 11 символов дать вам больше информации.s
,t
иp
показывают различия в ы Изе, т IME и р ermissions соответственно - для получения дополнительной информации попробуйтеman rsync
и поиск--itemize-changes
) ,Дополнительные опции, которые вы можете использовать
Если вы также хотите сравнить владельца / группу / права доступа к файлам, добавьте опции
-o
/-g
/-p
соответственно. В заключение отметим, что по умолчанию rsync считает два файла одинаковыми, если они имеют одинаковое имя, время и размер. Это очень быстро и в большинстве случаев более чем достаточно, но если вы хотите быть на 100%, добавьте-c
также, чтобы сравнить содержимое файлов с тем же именем, временем и размером.TLDR - просто дай мне сценарий, чтобы позвонить
Вот. Назови это так
Все опции, упомянутые выше в разделе «Дополнительные опции, которые вы можете использовать», также применимы и здесь.
Как это работает?
Мы называем rsync следующим образом:
Мы используем
-i
(--itemize-changes
), чтобы сообщить rsync о выводе одной строки вывода для каждого файла, который содержит информацию о любых различиях между двумя каталогами. Нам нужно-n
подавить нормальное поведение rsync (то есть попытаться синхронизировать два каталога путем копирования / удаления файлов). нам также нужно-r
работать рекурсивно для всех файлов / подкаталогов.Мы вызываем rsync три раза:
1-й вызов : распечатать файлы, которые не существуют в Dir_B. Нам нужно использовать,
--ignore-existing
чтобы игнорировать файлы, которые существуют с обеих сторон.2-й вызов : точно так же, как и раньше, но мы меняем порядок DIR_A / DIR_B.
3-й вызов : наконец, мы используем
--existing
только для проверки файлов, которые появляются в обоих каталогах.источник
--rsync-path="sudo rsync"
каждую команду rsync. Во-вторых, я хотел сравнить локальный каталог с удаленным каталогом. Я добавил,--rsh "ssh -p1234"
потому что в моем случае SSH работает через порт 1234. Затем я назвал скрипт какdiff-dirs user@111.11.1.1:/mnt/Vol1/dir1/ /localMnt/dir1 -c
.Из вашего вопроса я понимаю, что вы не хотите использовать diff для ls , но вы также можете использовать diff рекурсивно для каталогов:
источник
Мне понадобилось несколько попыток, чтобы заставить это работать. Ответ Нильса требует, чтобы он
$TARGET
заканчивался буксировкой/
, как объяснено ジ ョ ー ジ.Вот версия, которая явно добавляет трейлинг
/
:Это дает список файлов, которые существуют под
${SOURCE}
каталогом, но не ниже${TARGET}
каталога.Я использую
sed
здесь, чтобы удалить ведущиеdeleting
из выходных строк, и для печати только эти строки.Я не использую эту
rsync
опцию,-c
потому что сравнение содержимого файла будет намного медленнее для моих вариантов использования, и сравнение только размеров файлов и времени модификации также кажется достаточным в этих случаях. У меня нет причин подозревать, что мои компьютеры страдают от проблем с перекосом часов или что что-то злонамеренно изменило метки времени. Кроме того, результат-c
не может изменить решение об удалении файла, только решение об обновлении или сохранении файла.Я также использую
-u
и-a
(а не-r
), чтобы впоследствии я мог повторно использовать командную строку и изменить ее для копирования выбранных каталогов и файлов из${SOURCE}
в${TARGET}
, например, так:источник
У меня есть другая идея сделать это:
Вы можете сопоставить «FILEDETAIL ::» с выводом команды. Также вы можете изменить строку "FILEDETAIL ::". «% N» - это имя файла.
-r Это говорит rsync о рекурсивном копировании каталогов.
-n Это заставляет rsync выполнить пробный запуск, который не вносит никаких изменений.
источник