Zaskakująco żadna odpowiedź od 6 lat nie korzysta z tej -i
opcji 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
/ R
oznacza, że plik / katalog pojawia się tylko w katalogu L
eft lub R
ight.
X
Oznacza 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
, t
a p
obrazują różnice w ów ize, t ime i p ermissions odpowiednio - aby uzyskać więcej informacji próbować man rsync
i 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 -c
ró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 -n
stłumić normalne zachowanie rsync (który polega na próbie synchronizacji dwóch katalogów poprzez kopiowanie / usuwanie plików). musimy również -r
pracować 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-existing
aby 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 --existing
tylko do sprawdzania plików, które pojawiają się w obu katalogach.
rsync -rin --existing $DIR_A/ $DIR_B/