Untuk membuat daftar file baru atau yang dimodifikasi secara terprogram solusi terbaik yang dapat saya buat adalah menggunakan rsync , sortir , dan uniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Mari saya jelaskan dengan contoh ini: kami ingin membandingkan dua rilis dokuwiki untuk melihat file mana yang diubah dan mana yang baru dibuat.
Kami mengambil ter dengan wget dan mengekstraknya ke direktori old/dan 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
Menjalankan rsync salah satu cara mungkin kehilangan file yang baru dibuat karena perbandingan rsync dan diff ditampilkan di sini:
rsync -rcn --out-format="%n" old/ new/
menghasilkan output berikut:
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
Menjalankan rsync hanya dalam satu arah melewatkan file yang baru dibuat dan sebaliknya akan kehilangan file yang dihapus, bandingkan output dari diff:
diff -qr old/ new/
menghasilkan output berikut:
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
Menjalankan rsync baik cara dan mengurutkan output untuk menghapus duplikat mengungkapkan bahwa direktori data/pages/playground/dan file data/pages/playground/playground.txtawalnya tidak terjawab:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
menghasilkan output berikut:
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 Dijalankan dengan argumen tesis:
-r untuk "berulang ke direktori",
-c untuk juga membandingkan file dengan ukuran identik dan hanya "lewati berdasarkan checksum, bukan mod-time & size",
-n untuk "melakukan uji coba tanpa perubahan yang dibuat", dan
--out-format="%n" ke "keluaran pembaruan menggunakan FORMAT yang ditentukan", yaitu "% n" di sini hanya untuk nama file
Output (daftar file) dari rsynckedua arah digabungkan dan diurutkan menggunakan sort, dan daftar yang diurutkan ini kemudian diringkas dengan menghapus semua duplikat denganuniq