Programlı olarak yeni veya değiştirilmiş dosyaların bir listesini oluşturmak için gelebileceğim en iyi çözüm rsync , sort ve uniq kullanmaktır :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Bu örnekle açıklayayım: Hangi dosyaların değiştirildiğini ve hangilerinin yeni oluşturulduğunu görmek için iki dokuwiki sürümünü karşılaştırmak istiyoruz.
Biz wget ile katran getirme ve dizinleri onları ayıklamak old/
ve 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
Rsync'i tek yönlü çalıştırmak, yeni oluşturulan dosyaları, rsync ve diff'in karşılaştırması şurada gösterildiği gibi kaçırabilir:
rsync -rcn --out-format="%n" old/ new/
aşağıdaki çıktıyı verir:
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
Rsync'i sadece bir yönde çalıştırmak yeni oluşturulan dosyaları özlüyor ve diğer bir yol silinen dosyaları özleyecek, diff'in çıktısını karşılaştıracak:
diff -qr old/ new/
aşağıdaki çıktıyı verir:
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
Rsync'i her iki şekilde çalıştırmak ve kopyaları kaldırmak için çıktıyı sıralamak, dizinin data/pages/playground/
ve dosyanın data/pages/playground/playground.txt
başlangıçta kaçırıldığını gösterir:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
aşağıdaki çıktıyı verir:
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
şu argümanlarla çalıştırılır:
-r
"dizinleri tekrarlamak",
-c
aynı boyuttaki dosyaları karşılaştırmak ve yalnızca "mod-zaman ve boyut yerine sağlama toplamına göre atla",
-n
"değişiklik yapılmadan deneme sürümü çalıştırması" ve
--out-format="%n"
yalnızca dosya adı için "% n" olan "belirtilen FORMAT kullanarak güncellemeler çıktısını alma"
Her rsync
iki yönde çıktı (dosya listesi) kullanılarak birleştirilir ve sıralanır sort
ve bu sıralanan liste daha sonra tüm kopyalar kaldırılarak yoğunlaştırılır.uniq