Aby utworzyć listę nowych lub zmodyfikowanych plików programowo najlepszym rozwiązaniem, jakie mogłem wymyślić, jest użycie rsync , sort i uniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Pozwól mi wyjaśnić za pomocą tego przykładu: chcemy porównać dwie wersje dokuwiki, aby zobaczyć, które pliki zostały zmienione, a które nowo utworzone.
Ściągamy smoły za pomocą wget i wyodrębniamy je do katalogów old/
oraz 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
Uruchomienie rsync w jedną stronę może spowodować pominięcie nowo utworzonych plików, ponieważ porównanie rsync i diff pokazuje tutaj:
rsync -rcn --out-format="%n" old/ new/
daje następujące dane wyjściowe:
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
Uruchomienie rsync tylko w jednym kierunku powoduje pominięcie nowo utworzonych plików, a na odwrót pominięcie usuniętych plików, porównanie danych wyjściowych diff:
diff -qr old/ new/
daje następujące dane wyjściowe:
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
Uruchomienie rsync na dwa sposoby i sortowanie danych wyjściowych w celu usunięcia duplikatów ujawnia, że katalog data/pages/playground/
i plik data/pages/playground/playground.txt
zostały początkowo pominięte:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
daje następujące dane wyjściowe:
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
jest uruchamiany z tymi argumentami:
-r
„przekierowywać do katalogów”,
-c
aby również porównać pliki o identycznym rozmiarze i tylko „pomiń na podstawie sumy kontrolnej, a nie czasu i rozmiaru mod”,
-n
„wykonać jazdę próbną bez zmian”, oraz
--out-format="%n"
do „wypisywania aktualizacji za pomocą określonego FORMATU”, czyli „% n” tutaj tylko dla nazwy pliku
Dane wyjściowe (lista plików) rsync
w obu kierunkach są łączone i sortowane za pomocą sort
, a ta posortowana lista jest następnie zagęszczana poprzez usunięcie wszystkich duplikatów za pomocąuniq