दो अलग-अलग निर्देशिकाओं में मौजूद डिफिकल फाइल्स


303

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

जवाबों:


422

आप इसके लिए diffकमांड का उपयोग कर सकते हैं :

diff -bur folder1/ folder2/

यह एक पुनरावर्ती अंतर का उत्पादन करेगा जो एकीकृत संदर्भ के साथ रिक्त स्थान को अनदेखा करता है:

  • b फ्लैग का मतलब है व्हाट्सएप को नजरअंदाज करना
  • यू ध्वज का अर्थ है एक एकीकृत संदर्भ (पहले और बाद में 3 लाइनें)
  • r ध्वज का अर्थ है पुनरावर्ती

9
आप Win32 के लिए GNU उपयोगिताओं कोdiff डाउनलोड करके कमांड तक पहुंच सकते हैं ।
लॉरेंट एटिम्बेट

7
मैंने यह भी पाया है कि - विकल्प विकल्प उपयोगी है; आपको परिवर्तित फ़ाइलों की एक सूची मिलती है और उन्हें अलग से संसाधित कर सकते हैं
Dariusz

27
दूसरों को आश्चर्यचकित करने के लिए, -bव्हाट्सएप परिवर्तन को अनदेखा करता है और -uबफर की 3 लाइनें देता है।
रट्रे

28
इस कमांड को याद रखना आसान है यदि आप रग के बजाय रगड़ का उपयोग करते हैंdiff -rub folder1/ folder2/
SomeGuyOnAComputer

11
मुझे लगता है कि -burअगर आप एक ठंडी जलवायु में रहते थे तो याद रखना आसान होगा।
आलनह

126

यदि आप केवल उन फ़ाइलों को देखने के लिए इच्छुक हैं जो अलग-अलग हैं, तो आप उपयोग कर सकते हैं:

diff -qr dir_one dir_two | sort

विकल्प "क्यू" केवल उन फ़ाइलों को दिखाएगा जो अलग-अलग हैं, लेकिन सामग्री जो अलग-अलग नहीं है, और "सॉर्ट" आउटपुट वर्णानुक्रम में व्यवस्थित करेगा।


1
यह बहुत अच्छा है! यह भी कुशलता से काम करता है - यानी यदि एक पूरी उप-निर्देशिका केवल एक डायर में मौजूद है, तो इसका पुनरावर्ती में आना बंद हो जाता है और केवल उप-निर्देशिका ही (इसके उत्तराधिकारी सामग्री के बिना) रिपोर्ट करता है। बहुत अच्छा!!
SomeSomething

देखते हैं कि क्या, अगर कुछ भी, यह एक बहुत अच्छा पहला कदम है करता है भिन्न होते हैं, और उसके बाद एक विस्तृत करना diffभिन्न फ़ाइलों की प्रत्येक जोड़ी पर। यदि केवल एक या दो फाइलें अलग-अलग होती हैं तो एक का दृष्टिकोण बेतहाशा भिन्न होता है, यदि दर्जनों फाइलें भिन्न होती हैं। मैं diffएक ही बार में दर्जनों फ़ाइलों से आउटपुट में खो सकता है !
jvriesem

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

20

डिफ के पास एक विकल्प है, -rजो सिर्फ करने के लिए है।

diff -r dir1 dir2


11

diffन केवल दो फाइलों की तुलना कर सकते हैं, यह -rविकल्प का उपयोग करके , पूरी निर्देशिका पेड़ों को चला सकते हैं, प्रत्येक पेड़ में तुलनीय बिंदुओं पर होने वाली उपनिर्देशिकाओं और फ़ाइलों के बीच अंतर की जाँच कर सकते हैं।

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

यदि यह GNU है, तो आपको इसे केवल दो निर्देशिकाओं में इंगित करने और -r विकल्प का उपयोग करने में सक्षम होना चाहिए।

अन्यथा, उपयोग करके देखें

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

एनबी जैसा कि टिप्पणी अनुभाग में डेनिस द्वारा बताया गया है, आपको वास्तव में एलएस पर कमांड प्रतिस्थापन करने की आवश्यकता नहीं है। मैं यह इतने लंबे समय से कर रहा हूं कि मैं ऑटोपायलट पर बहुत ज्यादा कर रहा हूं और कमांड को प्रतिस्थापित करने के लिए मुझे अपनी फाइलों की सूची की तुलना करने की आवश्यकता है।

इसके अलावा मैं यह भी जोड़ना भूल गया कि मैं अपने उपनाम को GNU ls में अस्थायी रूप से अक्षम करने के लिए 'ls' करता हूं ताकि मैं GNU ls द्वारा लौटी लिस्टिंग से रंग स्वरूपण जानकारी खो दूं।


2
यह उपयोग करने के लिए आवश्यक नहीं है ls:for i in ./dir1/*
अगली सूचना तक रोका गया।

1
@ डेनिस, कायरतापूर्ण शॉर्टकट। +1। मैं ऐसा करने के लिए कमांड प्रतिस्थापन करने के लिए उपयोग किया जाता हूं, हालांकि यह स्वचालित है और मैं अभी उपयोग करता हूं जो मुझे कभी भी कमांड की आवश्यकता होती है, जैसे कि कभी-कभी मैं खोज का उपयोग कर रहा हूं। Ls का उपयोग करने से मुझे dir लिस्टिंग के साथ खेलने की सुविधा मिलती है, जैसे कि डिफ़ॉल्ट अनुक्रम के बजाय रिवर्स टाइम आधारित।
रॉब वेल्स

0

यहाँ दो फ़ोल्डरों में फ़ाइलों के बीच अंतर दिखाने के लिए एक स्क्रिप्ट है। यह पुनरावर्ती कार्य करता है। Dir1 और dir2 बदलें।

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

यदि आप विशेष रूप से फ़ाइलों की सामग्री की तुलना नहीं करना चाहते हैं और केवल यह देखना चाहते हैं कि दोनों निर्देशिकाओं में कोई मौजूद नहीं है, तो आप फ़ाइलों की सूची की तुलना दूसरे आदेश द्वारा उत्पन्न कर सकते हैं।

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'findरूट डायरेक्टरी के साथ प्रीफ़िक्स आउटपुट पथ को नहीं बताता है।

मैंने यह भी sortसुनिश्चित करने के लिए जोड़ा है कि दोनों कॉल में फ़ाइलों का क्रम समान होगा find

grepअंत में समान इनपुट लाइनों के बारे में जानकारी को हटा।


-4

इसे इस्तेमाल करे:

diff -rq /path/to/folder1 /path/to/folder2      

2
यह एक मौजूदा उत्तर को दोहराता है और कोई नई सामग्री नहीं जोड़ता है। कृपया जवाब न दें जब तक कि आपके पास योगदान देने के लिए वास्तव में कुछ नया न हो।
टोबे स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.