Per creare un elenco di file nuovi o modificati a livello di programmazione, la soluzione migliore che ho potuto trovare è usare rsync , sort e uniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Lasciatemi spiegare con questo esempio: vogliamo confrontare due versioni di dokuwiki per vedere quali file sono stati modificati e quali sono stati appena creati.
Prendiamo i tars con wget e li estraiamo nelle directory old/
e new/
:
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29d.tgz
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29.tgz
mkdir old && tar xzf dokuwiki-2014-09-29.tgz -C old --strip-components=1
mkdir new && tar xzf dokuwiki-2014-09-29d.tgz -C new --strip-components=1
L'esecuzione di rsync in un modo potrebbe perdere i file appena creati come il confronto tra rsync e diff mostra qui:
rsync -rcn --out-format="%n" old/ new/
produce il seguente output:
VERSION
doku.php
conf/mime.conf
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php
Eseguendo rsync solo in una direzione mancano i file appena creati e viceversa mancherebbero i file eliminati, confrontare l'output di diff:
diff -qr old/ new/
produce il seguente output:
Files old/VERSION and new/VERSION differ
Files old/conf/mime.conf and new/conf/mime.conf differ
Only in new/data/pages: playground
Files old/doku.php and new/doku.php differ
Files old/inc/auth.php and new/inc/auth.php differ
Files old/inc/lang/no/lang.php and new/inc/lang/no/lang.php differ
Files old/lib/plugins/acl/remote.php and new/lib/plugins/acl/remote.php differ
Files old/lib/plugins/authplain/auth.php and new/lib/plugins/authplain/auth.php differ
Files old/lib/plugins/usermanager/admin.php and new/lib/plugins/usermanager/admin.php differ
L'esecuzione di rsync in entrambi i modi e l'ordinamento dell'output per rimuovere i duplicati rivela che inizialmente la directory data/pages/playground/
e il file non data/pages/playground/playground.txt
sono stati rilevati:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
produce il seguente output:
VERSION
conf/mime.conf
data/pages/playground/
data/pages/playground/playground.txt
doku.php
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php
rsync
viene eseguito con questi argomenti:
-r
"ricorrere alle directory",
-c
per confrontare anche file di dimensioni identiche e solo "salta in base al checksum, non a mod-time e dimensioni",
-n
per "eseguire una corsa di prova senza apportare modifiche" e
--out-format="%n"
a "output aggiornamenti usando il FORMATO specificato", che è "% n" qui solo per il nome del file
L'output (elenco di file) rsync
in entrambe le direzioni viene combinato e ordinato utilizzando sort
, e questo elenco ordinato viene quindi condensato rimuovendo tutti i duplicati conuniq