ในการสร้างรายการไฟล์ใหม่หรือไฟล์ที่ถูกแก้ไขโดยทางโปรแกรมทางออกที่ดีที่สุดที่ฉันสามารถทำได้คือใช้rsync , sortและuniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
ให้ฉันอธิบายด้วยตัวอย่างนี้: เราต้องการเปรียบเทียบ dokuwiki สองรุ่นเพื่อดูว่าไฟล์ใดบ้างที่ถูกเปลี่ยนแปลงและไฟล์ไหนที่เพิ่งถูกสร้างขึ้นใหม่
เราดึงข้อมูล tars ด้วย wget และแยกออกเป็นไดเรกทอรีold/
และ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 วิธีหนึ่งอาจพลาดไฟล์ที่สร้างขึ้นใหม่เนื่องจากการเปรียบเทียบ rsync และ diff แสดงที่นี่:
rsync -rcn --out-format="%n" old/ new/
ให้ผลลัพธ์ต่อไปนี้:
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 ในทิศทางเดียวจะไม่ได้รับไฟล์ที่สร้างขึ้นใหม่และอีกวิธีหนึ่งจะทำให้ไฟล์ที่ลบถูกลบไปเปรียบเทียบเอาต์พุตของ diff
diff -qr old/ new/
ให้ผลลัพธ์ต่อไปนี้:
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 ทั้งสองวิธีและเรียงลำดับผลลัพธ์เพื่อลบรายการที่ซ้ำกันเผยให้เห็นว่าไดเรกทอรีdata/pages/playground/
และไฟล์data/pages/playground/playground.txt
นั้นพลาดไปตั้งแต่แรก:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
ให้ผลลัพธ์ต่อไปนี้:
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
ทำงานด้วยข้อโต้แย้งเหล่านี้:
-r
เพื่อ "เรียกคืนสู่ไดเรกทอรี"
-c
เพื่อเปรียบเทียบไฟล์ที่มีขนาดเท่ากันและมีเพียง "ข้ามจากการตรวจสอบไม่ใช่เวลาและขนาด"
-n
เพื่อ "ทำการทดลองใช้งานโดยไม่มีการเปลี่ยนแปลง" และ
--out-format="%n"
เป็น "การอัพเดตเอาต์พุตโดยใช้ FORMAT ที่ระบุ" ซึ่งเป็น "% n" ที่นี่สำหรับชื่อไฟล์เท่านั้น
เอาต์พุต (รายการไฟล์) ของrsync
ทั้งสองทิศทางจะรวมกันและเรียงลำดับโดยใช้sort
แล้วรายการที่เรียงลำดับนี้จะถูกย่อด้วยการลบรายการที่ซ้ำกันทั้งหมดด้วยuniq