टूटी हुई लिंक पर आउटपुट के बिना पुन: दो निर्देशिकाओं की तुलना करें -r के साथ


38

मैं diff -r a bपुनरावर्ती निर्देशिका a और b की तुलना करने के लिए उपयोग कर रहा हूं । यह अक्सर ऐसा होता है कि कुछ टूटे हुए लिंक होते हैं ( एक और बी निर्देशिका में एक ही टूटे हुए लिंक और एक ही, गैर-मौजूदा लक्ष्य) की ओर इशारा करते हैं।

diff तो उन मामलों और एक गैर शून्य से बाहर निकलें कोड के साथ बाहर निकलता है के लिए आउटपुट त्रुटि संदेश, लेकिन मैं के रूप में निर्देशिका मेरी किताब में ही कर रहे हैं यह 0 से चुप रहने के लिए, और बाहर निकलने चाहते हैं।

मैं उसे कैसे कर सकता हूँ?


क्या आप अभी भी तुलना (और समतुल्य लेकिन टूटे हुए के रूप में पहचाने जाने वाले) की तुलना में सहानुभूति चाहते हैं, या क्या यह अंतर करते समय सभी सिम्बलिंक को अनदेखा करना स्वीकार्य है?
ire_and_curses 23

तुलना की और समान के रूप में पहचाना, मुझे परवाह नहीं है अगर वे टूट गए हैं। मैं बस यह सत्यापित करने की कोशिश कर रहा हूं कि मेरे rsync ने काम किया है।
मार्कस जुनियस ब्रूटस

जवाबों:


24

संस्करण 3.3 या उसके बाद के लिए diff, आपको --no-dereferenceविकल्प का उपयोग करना चाहिए , जैसा कि पीट हरलान के उत्तर में वर्णित है ।

दुर्भाग्य से, पुराने संस्करण diff सहानुभूति की अनदेखी का समर्थन नहीं करते हैं :

कुछ फाइलें न तो निर्देशिकाएं हैं और न ही नियमित फाइलें: वे असामान्य फाइलें हैं जैसे प्रतीकात्मक लिंक, डिवाइस विशेष फाइलें, नाम पाइप और सॉकेट। वर्तमान में, diffनियमित फ़ाइलों की तरह प्रतीकात्मक लिंक का व्यवहार करता है; यदि वे शीर्ष स्तर पर निर्दिष्ट हैं, तो यह नियमित फ़ाइलों जैसी अन्य विशेष फ़ाइलों का व्यवहार करता है, लेकिन निर्देशिकाओं की तुलना करते समय उनकी उपस्थिति की रिपोर्ट करता है। इसका मतलब है कि patchऐसी फ़ाइलों में परिवर्तन का प्रतिनिधित्व नहीं कर सकता है। उदाहरण के लिए, यदि आप बदलते हैं जो एक प्रतीकात्मक लिंक को इंगित करता है, diffतो प्रतीकात्मक लिंक में परिवर्तन के बजाय, दो फ़ाइलों के बीच अंतर को आउटपुट करता है।

diffविशेष रूप से विशेष फ़ाइलों के परिवर्तनों को वैकल्पिक रूप से रिपोर्ट करना चाहिए, और patchइन एक्सटेंशनों को समझने के लिए बढ़ाया जाना चाहिए।

यदि आप सभी चाहते हैं कि आप rsync को सत्यापित करें (और संभवतः जो याद आ रही है उसे ठीक करें), तो आप rsync कमांड को दूसरी बार चला सकते हैं। यदि आप ऐसा नहीं करना चाहते हैं, तो निर्देशिका का चेक-योग पर्याप्त हो सकता है।

यदि आप वास्तव में इसके साथ करना चाहते हैं diff, तो आप findसिमिलिंक को छोड़ने के लिए उपयोग कर सकते हैं , और प्रत्येक फ़ाइल पर अलग-अलग रन कर सकते हैं । अपने निर्देशिका दर्रा एक और तर्कों के रूप में:

#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
    # Suppress details of differences
    diff -rq $f $2/${f##*/}
done

या एक-लाइनर के रूप में:

for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done

यह फ़ाइलों है कि सामग्री में भिन्न होते हैं, या फ़ाइलों जिसमें हैं की पहचान करेगा एक लेकिन में नहीं

ध्यान दें कि:

  • चूँकि हम पूरी तरह से सिम्बलिंक को छोड़ रहे हैं, इसलिए यह ध्यान नहीं देगा कि सिमिलिंक नाम b में मौजूद नहीं हैं । यदि आपको इसकी आवश्यकता है, तो आपको सभी सिम्बलिंक की पहचान करने के लिए दूसरी खोज पास की आवश्यकता होगी और फिर स्पष्ट रूप से बी में उनके अस्तित्व की जांच करनी होगी ।
  • बी में अतिरिक्त फाइलों की पहचान नहीं की जाएगी, क्योंकि सूची की सामग्री से निर्मित है । यह संभवतः आपके rsyncपरिदृश्य के लिए कोई समस्या नहीं है।

प्रस्तावित स्क्रिप्ट निर्देशिका 'ए' में मौजूद किसी भी निर्देशिका के लिए पुनरावर्ती रूप से काम नहीं करती है (बी / $ {f ## *} का उपयोग करके 'बी' के लिए बनाए गए रास्ते सही नहीं हैं)।
मार्कस जूनियस ब्रूटस

@MarcusJuniusBrutus - हाँ, आप सही हैं। मुझे लगता है कि समाधान एक # को हटाने के लिए है, उदाहरण के for f in लिए एक / * खोजें! -टाइप एल ;do echo $f b/${f#*/};done। हालांकि मेरे पास इस समय परीक्षण करने का समय नहीं है। मुझे बताएं कि क्या वह काम करता है।
ire_and_curses

यह है बेहतर लेकिन यह अभी भी कई मामलों में filepaths को खराब करता। स्क्रिप्ट (एक # हटाया गया) के साथ काम करने के लिए सीधे 'ए' पर एक निर्देशिका से मंगाने की आवश्यकता प्रतीत होती है।
मार्कस जुनियस ब्रूटस

जीएनयू अंतर 3.3 (नीचे पोस्टिंग देखें) का उपयोग करते समय यह उत्तर अप्रचलित हो जाता है
बर्ड ग्लोस

उपरोक्त स्क्रिप्ट में कई समस्याएं हैं, पहले सभी फ़ाइल नामों को खोजने और एक विस्तारित कमांड लाइन को खिलाने के कारण। (1) यह केवल फाइलों के छोटे संग्रह के साथ काम करेगा। (2) विशेष चरित्र (यहां तक ​​कि एक स्थान) के साथ कोई भी फ़ाइल नाम संसाधित नहीं किया जाएगा। (३) हमेशा $(xxx)बैकटिक्स के बजाय उपयोग करें । बैकटिक्स समरूपता उन्हें कम पठनीय बनाता है और घोंसले के शिकार को रोकता है। 1 और 2 के बारे में देखें stackoverflow.com/questions/11366184/…
स्टीफन गौरिचोन

19

संस्करण 3.3 के बाद से GNU diffसहानुभूति नहीं dlferencing का समर्थन करता है, लेकिन फिर उन रास्तों की तुलना करता है जिन्हें वे इंगित करते हैं।

GNU diffutils> = 3.3 स्थापित करें और --no-dereferenceविकल्प का उपयोग करें ; उसके लिए कोई छोटा विकल्प नहीं है।

यदि समान या:

प्रतीकात्मक लिंक /tmp/noderef/a/symlinkऔर /tmp/noderef/b/symlinkअलग


अब अगर केवल यह सामग्री में बदलाव दिखाएगा, जैसे कि
सिम्लिंक

6

आप के एक नए संस्करण का उपयोग कर सकते हैं diff

diffजीएनयू में diffutils3.3 एक भी शामिल --no-dereferenceहै कि आप अपने लक्ष्य से सिमलिंक खुद को तुलना करने के लिए नहीं बल्कि अनुमति देता है विकल्प। यह रिपोर्ट करता है कि अगर वे अलग हैं, तो चुप हैं अगर वे सहमत हैं और परवाह नहीं करते हैं कि क्या वे टूट गए हैं।

मुझे नहीं पता कि विकल्प कब जोड़ा गया था; यह 2.8.1 में मौजूद नहीं है।


मैं पुष्टि कर सकता हूँ कि मौजूद नहीं है (GNU diffutils) 3.2 या तो
एल्डर गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.