क्या मैं उनकी सामग्री को छापे बिना समान फ़ाइलों से मेल खाते `diff -q` के विपरीत प्राप्त कर सकता हूं


13

मेरे पास एक निर्देशिका में कई फाइलें हैं, और मैं जांचना चाहता हूं कि वे सभी अद्वितीय हैं। : सादगी के लिए, मान मैं तीन फ़ाइलें जाने foo.txt, bar.txtऔर baz.txt। यदि मैं इस लूप को चलाता हूं, तो मैं उन सभी को एक-दूसरे के खिलाफ जांच करूंगा:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

उन सैकड़ों फाइलों के लिए जिनसे मैं निपटना चाहता हूं, यह बहुत ही अपठनीय होगा; यह फ़ाइलों को सूचीबद्ध करने के लिए बेहतर होगा करने के मैच, और फिर मैं जल्दी से सूची को देखेगा और यह सुनिश्चित करें कि फ़ाइलों को केवल खुद को मिलान कर रहे हैं कर सकते हैं। मैनपेज से, मैंने सोचा होगा कि -sविकल्प इसे पूरा करेगा:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... लेकिन, वास्तव में यह भी बाहर किसी भी फाइल है कि अलग की पूरी सामग्री प्रिंट करता है। क्या इस व्यवहार को दबाने का कोई तरीका है, इसलिए मुझे केवल ऊपर का व्यवहार मिलता है?

वैकल्पिक रूप से, क्या कोई अन्य उपकरण है जो इसे पूरा कर सकता है ?

जवाबों:


6

यदि आप बस यह जांचना चाहते हैं कि दो फाइलें समान हैं या नहीं, तो उपयोग करें cmp। केवल समान फ़ाइलों के लिए आउटपुट प्राप्त करने के लिए, आप उपयोग कर सकते हैं

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

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


12

यह काम कर जाना चाहिए:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

कहां dir1और dir2आपकी दो निर्देशिकाएं हैं।

यदि आप केवल मिलान निर्देशिकाओं को प्रिंट करना चाहते हैं dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

और इसी तरह, यदि आप केवल मिलान निर्देशिकाओं को प्रिंट करना चाहते हैं dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

यह वही है जो मैं देख रहा था, धन्यवाद!
जोशुआ सोइलू

diff -qrsबड़ी फ़ाइलों की तुलना करते समय उपयोग करें (मुद्रण मतभेदों को शांत करता है)
marcovtwout

4

सबसे तेजी से उस उद्देश्य के लिए लिखा उपकरण है fdupes (यह फेडोरा और Ubuntu और के पैकेज रेपोस में उपलब्ध है ...)

उपयोग:

fdupes -r dir1 dir2

2

यदि आपको किसी सूची में समान फ़ाइलों को खोजने की आवश्यकता है, तो पहले उन्हें आकार के अनुसार क्रमबद्ध करें, उदाहरण के लिए

ls -S

फिर समान आकार की फ़ाइलों के प्रत्येक समूह के लिए, md5sumउन पर आसानी से देखने के लिए चलाएं जो समान हैं।

बड़ी फ़ाइलों के लिए, पहले चेकसम से पूरी फ़ाइल का केवल एक छोटा टुकड़ा जल्दी हो सकता है:

dd if=file bs=512 count=1 | md5sum

और फिर केवल संदिग्ध फाइलों पर एक पूर्ण चेकसम प्रदर्शन करें।

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