जवाबों:
अलग मैन पेज से:
-q
केवल रिपोर्ट करें कि क्या फाइलें भिन्न हैं, न कि मतभेदों का विवरण।
-r
निर्देशिकाओं की तुलना करते समय, पाए गए किसी भी उपनिर्देशिका की पुनरावृत्ति की तुलना करें।
उदाहरण आदेश:
diff -qr dir1 dir2
उदाहरण आउटपुट (स्थान पर निर्भर करता है):
$ ls dir1 dir2
dir1:
same-file different only-1
dir2:
same-file different only-2
$ diff -qr dir1 dir2
Files dir1/different and dir2/different differ
Only in dir1: only-1
Only in dir2: only-2
-x PATTERN
कुछ उपनिर्देशिकाओं को बाहर करने के लिए कमांड में शामिल कर सकते हैं । उदाहरण के लिए, diff -qr repo1 repo2 -x ".git"
दो निर्देशिकाओं की तुलना करेंगे , लेकिन उनमें ".गित" के साथ फ़ाइल पथ को बाहर कर देंगे।
आप rsync का उपयोग भी कर सकते हैं
rsync -rv --size-only --dry-run /my/source/ /my/dest/ > diff.out
--size-only
समान आकार की फाइलें लेकिन अलग-अलग सामग्री, जैसे पुराने / version.txt "29a" नए / version.txt "29b" को याद करेंगे । इसके बजाय का उपयोग करें: rsync -ric --dry-run old/ new/
जहां "-i" तर्क फ़ाइल सूची को सीधे माध्यम से प्राप्त करने की अनुमति देता हैrsync -ric --dry-run old/ new/ | cut -d" " -f 2
यदि आप ऐसी फ़ाइलों की सूची प्राप्त करना चाहते हैं जो केवल एक निर्देशिका में हैं और उनकी उप निर्देशिका नहीं हैं और केवल उनके फ़ाइल नाम हैं:
diff -q /dir1 /dir2 | grep /dir1 | grep -E "^Only in*" | sed -n 's/[^:]*: //p'
यदि आप उन सभी फ़ाइलों और निर्देशिकाओं की पुनरावृत्ति करना चाहते हैं, जो उनके पूर्ण पथों के साथ भिन्न हैं:
diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}'
इस तरह आप सभी फाइलों पर अलग-अलग कमांड लगा सकते हैं।
उदाहरण के लिए मैं dir1 में नहीं बल्कि dir2 में मौजूद सभी फाइलों और निर्देशिकाओं को हटा सकता हूं:
diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}' xargs -I {} rm -r {}
मेरे फाइल सिस्टम पर सिर्फ फ़ाइल नाम पाने के लिए
diff -q /dir1 /dir2|cut -f2 -d' '
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
मेरे लिए ठीक काम करता है!
चलाने के दृष्टिकोण diff -qr old/ new/
में एक बड़ी खामी है: यह नई बनाई गई निर्देशिकाओं में फ़ाइलों को याद कर सकता है। उदाहरण के लिए फ़ाइल के नीचे उदाहरण data/pages/playground/playground.txt
आउटपुट में नहीं है diff -qr old/ new/
जबकि निर्देशिका data/pages/playground/
है ( जल्दी से तुलना करने के लिए अपने ब्राउज़र में खेल के मैदान की खोज करें।)। मैंने यूनिक्स और लिनक्स स्टैक एक्सचेंज पर निम्नलिखित समाधान भी पोस्ट किया है , लेकिन मैं इसे यहां भी कॉपी करूंगा:
प्रोग्रामिक रूप से सबसे अच्छा समाधान जो मैं आ सकता था, की एक सूची बनाने के लिए rsync , सॉर्ट और साइज़ का उपयोग कर रहा हूँ :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
मुझे इस उदाहरण के साथ समझाएं: हम दो डाकुविकी रिलीज की तुलना यह देखना चाहते हैं कि कौन सी फाइलें बदली गई थीं और कौन से नए बनाए गए थे।
हम टार्स को 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 की तुलना में नई बनाई गई फ़ाइलें छूट सकती हैं और यहाँ अलग-अलग शो हो सकते हैं:
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 -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
diff new/ old/
देखने के लिए कि कौन सी निर्देशिकाएं हटा दी गई थीं?
diff -qr new/ old/
Dokuwiki tars के साथ ऊपर दिए गए उदाहरण पर चलने से समान आउटपुट उत्पन्न होता है diff -qr old/ new/
- यानी आप देखते हैं कि निर्देशिका नई है / लापता है, लेकिन इसमें फाइलें नहीं हैं
diff
CentOS 7 में मैन पेज-q
"केवल फाइलों के अलग होने पर रिपोर्ट" के रूप में वर्णन करता है, जो आपके द्वारा लिखे गए से कम स्पष्ट है।