Дивно, але жодна відповідь за 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 або R
dright 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/