Sorprendentemente nessuna risposta in 6 anni usa l' -i
opzione o dà un buon risultato quindi qui andrò:
TLDR - Fammi vedere i comandi
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 /'
Comprensione dell'output
Ecco un esempio dell'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
Nota il primo carattere di ogni riga:
L
/ R
significa che il file / dir appare solo alla dir L
eft o R
ight.
X
significa che il file viene visualizzato su entrambi i lati, ma non è la stessa (nel qual caso i prossimi 11 caratteri che danno più informazioni. s
, t
e p
raffigurano le differenze di s ize, t ime e p ermissions rispettivamente - per ulteriori informazioni provare man rsync
e cercare --itemize-changes
) .
Opzioni extra che potresti voler usare
Se si desidera confrontare anche il proprietario / gruppo / autorizzazioni dei file, aggiungere le opzioni -o
/ -g
/ -p
rispettivamente. Infine, nota che per impostazione predefinita rsync considera due file uguali se hanno lo stesso nome, tempo e dimensioni. Questo è estremamente veloce e la maggior parte delle volte più che sufficiente, ma se vuoi essere sicuro -c
al 100% aggiungi per confrontare anche il contenuto dei file con lo stesso nome, tempo e dimensioni.
TLDR - Dammi solo uno script da chiamare
Ecco qui. Chiamalo così
diff-dirs Left_Dir Right_Dir [options]
Tutte le opzioni sopra menzionate nella sezione "Opzioni extra che potresti voler usare" si applicano anche qui.
#!/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 /'
Come funziona?
Chiamiamo rsync in questo modo:
rsync -rin ...
Usiamo -i
( --itemize-changes
) per dire a rsync di stampare una riga di output per ogni file che contiene informazioni su eventuali differenze tra le due directory. Dobbiamo -n
sopprimere il normale comportamento di rsync (che è quello di provare a sincronizzare le due directory copiando / eliminando i file). dobbiamo anche -r
lavorare in modo ricorsivo per tutti i file / sottodirectory.
Chiamiamo rsync tre volte:
1a chiamata : stampa file che non esistono in Dir_B. Dobbiamo usare --ignore-existing
per ignorare i file che esistono su entrambi i lati.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
2a chiamata : esattamente come prima ma scambiamo l'ordine di DIR_A / DIR_B.
3a chiamata : infine usiamo --existing
solo per controllare i file che appaiono in entrambe le directory.
rsync -rin --existing $DIR_A/ $DIR_B/