Para crear una lista de archivos nuevos o modificados mediante programación, la mejor solución que se me ocurre es usar rsync , sort y uniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Permítanme explicar con este ejemplo: queremos comparar dos versiones de dokuwiki para ver qué archivos se cambiaron y cuáles se crearon recientemente.
Buscamos los tars con wget y los extraemos en los directorios old/
y 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
Ejecutar rsync de una manera puede perder archivos recién creados como se muestra aquí en la comparación de rsync y diff:
rsync -rcn --out-format="%n" old/ new/
produce el siguiente resultado:
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
Al ejecutar rsync solo en una dirección, se pierden los archivos recién creados y, al revés, se pierden los archivos eliminados, compare la salida de diff:
diff -qr old/ new/
produce el siguiente resultado:
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
Ejecutar rsync en ambos sentidos y ordenar la salida para eliminar duplicados revela que el directorio data/pages/playground/
y el archivo data/pages/playground/playground.txt
se perdieron inicialmente:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
produce el siguiente resultado:
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
se ejecuta con estos argumentos:
-r
"recurrir a directorios",
-c
para comparar también archivos de tamaño idéntico y solo "omitir en función de la suma de comprobación, no de mod-time & size",
-n
para "realizar una ejecución de prueba sin realizar cambios", y
--out-format="%n"
"generar actualizaciones utilizando el FORMATO especificado", que es "% n" aquí solo para el nombre del archivo
La salida (lista de archivos) de rsync
en ambas direcciones se combina y ordena usando sort
, y esta lista ordenada se condensa eliminando todos los duplicados conuniq