Zaskakująco żadna odpowiedź od 6 lat nie korzysta z tej -iopcji lub daje niezły wynik, więc zacznę:
TLDR - Po prostu pokaż mi polecenia
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 /'
Zrozumienie wyników
Oto przykład wyniku:
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
Zwróć uwagę na pierwszy znak każdej linii:
L/ Roznacza, że plik / katalog pojawia się tylko w katalogu Left lub Right.
XOznacza to, że po obu stronach pojawia się plik, ale to nie to samo (w tym przypadku kolejne 11 znaków daje więcej info. s, ta pobrazują różnice w ów ize, t ime i p ermissions odpowiednio - aby uzyskać więcej informacji próbować man rsynci szukać --itemize-changes) .
Dodatkowe opcje, których możesz chcieć użyć
Jeśli chcesz również porównać właściciela / grupę / uprawnienia do plików, dodaj odpowiednio opcje -o/ -g/ -p. Na koniec zauważ, że domyślnie rsync uważa dwa pliki za takie same, jeśli mają tę samą nazwę, godzinę i rozmiar. Jest to niezwykle szybkie i przez większość czasu więcej niż wystarczające, ale jeśli chcesz być w 100% pewien, dodaj -crównież porównaj zawartość plików o tej samej nazwie, czasie i rozmiarze.
TLDR - Po prostu daj mi skrypt do wywołania
Oto jest Nazwij to tak
diff-dirs Left_Dir Right_Dir [options]
Obowiązują tu również wszystkie opcje wymienione powyżej w sekcji „Opcje dodatkowe, których możesz chcieć użyć”.
#!/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 /'
Jak to działa?
Nazywamy rsync w ten sposób:
rsync -rin ...
Używamy -i( --itemize-changes), aby powiedzieć rsync, aby wypisała jeden wiersz danych wyjściowych dla każdego pliku zawierającego informacje o różnicach między dwoma katalogami. Musimy -nstłumić normalne zachowanie rsync (który polega na próbie synchronizacji dwóch katalogów poprzez kopiowanie / usuwanie plików). musimy również -rpracować rekurencyjnie dla wszystkich plików / podkatalogów.
Nazywamy rsync trzy razy:
Pierwsze połączenie : drukuj pliki, które nie istnieją w Dir_B. Musimy użyć, --ignore-existingaby zignorować pliki istniejące po obu stronach.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
Drugie połączenie : Dokładnie jak poprzednio, ale zamieniamy kolejność DIR_A / DIR_B.
Trzecie połączenie : Wreszcie używamy --existingtylko do sprawdzania plików, które pojawiają się w obu katalogach.
rsync -rin --existing $DIR_A/ $DIR_B/