Um eine Liste mit neuen oder geänderten Dateien programmgesteuert zu erstellen, ist die beste Lösung, die ich finden könnte, die Verwendung von rsync , sort und uniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Lassen Sie mich anhand dieses Beispiels erklären: Wir möchten zwei DokuWiki-Versionen vergleichen, um festzustellen, welche Dateien geändert und welche neu erstellt wurden.
Wir holen die Teere mit wget und extrahieren sie in die Verzeichnisse old/
und 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
Wenn Sie rsync auf eine Weise ausführen, werden möglicherweise neu erstellte Dateien übersehen, wie der Vergleich von rsync und diff hier zeigt:
rsync -rcn --out-format="%n" old/ new/
ergibt folgende Ausgabe:
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
Wenn Sie rsync nur in einer Richtung ausführen, werden die neu erstellten Dateien übersehen, und in der anderen Richtung werden gelöschte Dateien übersehen. Vergleichen Sie die Ausgabe von diff:
diff -qr old/ new/
ergibt folgende Ausgabe:
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
Wenn Sie rsync in beide Richtungen ausführen und die Ausgabe sortieren, um Duplikate zu entfernen, wurde festgestellt, dass das Verzeichnis data/pages/playground/
und die Datei data/pages/playground/playground.txt
ursprünglich übersehen wurden:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
ergibt folgende Ausgabe:
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
wird mit diesen Argumenten ausgeführt:
-r
in Verzeichnisse "rekursieren",
-c
um auch Dateien mit identischer Größe zu vergleichen und nur "Überspringen basierend auf Prüfsumme, nicht Mod-Zeit & Größe",
-n
"Probelauf ohne Änderungen durchführen" und
--out-format="%n"
"Aktualisierungen mit dem angegebenen FORMAT ausgeben", hier "% n" nur für den Dateinamen
Die Ausgabe (Dateiliste) rsync
in beiden Richtungen wird kombiniert und sortiert sort
, und diese sortierte Liste wird dann verdichtet, indem alle Duplikate mit entfernt werdenuniq