केवल फ़ाइल नाम के उत्पादन के लिए अलग है


244

मैं एक लिनक्स कमांड चलाने की कोशिश कर रहा हूं जो दो निर्देशिकाओं की तुलना करेगा और जो अलग है उसका केवल फ़ाइल नाम ही आउटपुट करेगा । इसमें कुछ भी शामिल है जो एक निर्देशिका में मौजूद है और दूसरे या इसके विपरीत नहीं है, और पाठ अंतर।

जवाबों:


376

अलग मैन पेज से:

-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

धन्यवाद - diffCentOS 7 में मैन पेज -q"केवल फाइलों के अलग होने पर रिपोर्ट" के रूप में वर्णन करता है, जो आपके द्वारा लिखे गए से कम स्पष्ट है।
चाप

2
यह उन फ़ाइलों की वास्तविक सामग्री की तुलना करता है जो अक्सर वही होता है जो कोई चाहता है, हालांकि, rsync उत्तर केवल फ़ाइल नाम और आकारों को देखने का विकल्प देता है, और सामग्री को नहीं; यह कभी-कभी वांछनीय है।
स्टीवेब

MacOS पर भी काम करता है।
मेरियस सौटियर

इसके अलावा, -x PATTERNकुछ उपनिर्देशिकाओं को बाहर करने के लिए कमांड में शामिल कर सकते हैं । उदाहरण के लिए, diff -qr repo1 repo2 -x ".git" दो निर्देशिकाओं की तुलना करेंगे , लेकिन उनमें ".गित" के साथ फ़ाइल पथ को बाहर कर देंगे।
वीएफएफआई

27

आप rsync का उपयोग भी कर सकते हैं

rsync -rv --size-only --dry-run /my/source/ /my/dest/ > diff.out

6
--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
iolsmit

6
यह बहुत अच्छा है यदि आप केवल लापता फ़ाइलों (विशेष रूप से नेटवर्क शेयरों में) की तलाश कर रहे हैं, क्योंकि यह सामग्री की तुलना नहीं करता है। इससे मुझे कुछ फ़ाइलों को खोजने में मदद मिली जो एक नए एनएएस में माइग्रेट करने में विफल रही।
१६

4
Rsync की कमांड लाइन पर निर्दिष्ट पथ के लिए अनुगामी स्लैश को शामिल करना सुनिश्चित करें। उन्हें समझें, यह सही ढंग से काम नहीं करेगा, और rsync की संभावना है कि सभी फ़ाइल नामों की गणना की जाएगी!
व्लादिमीर पेंटेलेव

2
सामग्री की जाँच नहीं करने पर टिप्पणियों के संबंध में। यह कभी-कभी वांछनीय होता है, कम से कम पहले पास के रूप में।
चरण

13

यदि आप ऐसी फ़ाइलों की सूची प्राप्त करना चाहते हैं जो केवल एक निर्देशिका में हैं और उनकी उप निर्देशिका नहीं हैं और केवल उनके फ़ाइल नाम हैं:

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 {}

9

मेरे फाइल सिस्टम पर सिर्फ फ़ाइल नाम पाने के लिए

diff -q /dir1 /dir2|cut -f2 -d' '

7
मैं अपने लिनक्स सिस्टम पर रिक्त स्थान के साथ फ़ाइल नाम नहीं रखता। ;)
गेरार्डव

6
मेरा आपसे यह मतलब नहीं था ...
?

मेरे लिए काम नहीं करता है। मेरी निर्देशिका संरचना नीचे की तरह है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' 'मेरे लिए ठीक काम करता है!
फ्रांसेस्को

9

चलाने के दृष्टिकोण 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/- यानी आप देखते हैं कि निर्देशिका नई है / लापता है, लेकिन इसमें फाइलें नहीं हैं
iolsmit

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.