सही तरीका इस बात पर निर्भर करता है कि आप क्यों पूछ रहे हैं:
विकल्प 1: केवल डेटा की तुलना करें
यदि आपको पेड़ की फ़ाइल सामग्री के लिए एक हैश चाहिए, तो यह चाल चलेगा:
$ find -s somedir -type f -exec md5sum {} \; | md5sum
यह पहली बार व्यक्तिगत रूप से एक पूर्वानुमेय क्रम में सभी फ़ाइल सामग्रियों को संक्षेप में प्रस्तुत करता है, फिर फ़ाइल नामों और एमडी 5 हैश की सूची को स्वयं हीहेड करने के लिए पास करता है, एक एकल मान देता है जो केवल तब बदलता है जब पेड़ में फ़ाइलों में से एक की सामग्री बदल जाती है।
दुर्भाग्य से, find -sकेवल BSD खोजने (1) के साथ काम करता है, जिसका उपयोग macOS, FreeBSD, NetBSD और OpenBSD में किया जाता है। जीएनयू या एसयूएस (1) के साथ एक प्रणाली पर तुलनीय कुछ प्राप्त करने के लिए, आपको कुछ बदसूरत होने की आवश्यकता है:
$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum
हमने find -sएक कॉल से बदल दिया है sort। -k 2बिट यह बताता है MD5 हैश के ऊपर छोड़, तो यह केवल फ़ाइल नाम है, जो, अंत लाइन के माध्यम से क्षेत्र 2 में हैं द्वारा सॉर्ट करता sortहै गणना।
कमांड के इस संस्करण के साथ एक कमजोरी है, जो यह है कि यह भ्रमित होने के लिए उत्तरदायी है यदि आपके पास उन में नईलाइनों के साथ कोई फ़ाइल नाम है, क्योंकि यह sortकॉल करने के लिए कई लाइनों की तरह दिखेगा । find -sसंस्करण है, कि समस्या नहीं है, क्योंकि पेड़ ट्रावर्सल और छंटाई एक ही कार्यक्रम के भीतर हो find।
या तो मामले में, झूठी सकारात्मक से बचने के लिए छंटाई आवश्यक है: सबसे आम यूनिक्स / लिनक्स फाइल सिस्टम एक स्थिर, अनुमानित क्रम में निर्देशिका लिस्टिंग को बनाए नहीं रखते हैं। आपको इसका उपयोग करने lsऔर इस तरह का एहसास नहीं हो सकता है , जो चुपचाप आपके लिए निर्देशिका सामग्री को सॉर्ट करता है। findबिना -sया sortकॉल के फाइल को प्रिंट करने के लिए जा रहा है जो कुछ भी क्रम में अंतर्निहित फाइलसिस्टम उन्हें वापस कर देता है, जो इस आदेश का कारण बदल दिया गया हैश मान दे सकता है यदि इनपुट के रूप में इसे दी गई फ़ाइलों का क्रम बदल जाता है।
आपको md5sumकमांड md5या किसी अन्य हैश फ़ंक्शन को बदलने की आवश्यकता हो सकती है । यदि आप एक और हैश फ़ंक्शन चुनते हैं और आपके सिस्टम के लिए कमांड के दूसरे रूप की आवश्यकता होती है, तो आपको sortकमांड को तदनुसार समायोजित करने की आवश्यकता हो सकती है । एक और जाल यह है कि कुछ डेटा योग कार्यक्रमों में फ़ाइल का नाम बिल्कुल नहीं लिखा जाता है, एक प्रमुख उदाहरण पुराना यूनिक्स sumकार्यक्रम है।
यह विधि कुछ हद तक अक्षम है, जिसमें md5sumN + 1 बार कॉल किया जाता है , जहां N पेड़ में फ़ाइलों की संख्या है, लेकिन हैशिंग फ़ाइल और निर्देशिका मेटाडेटा से बचने के लिए यह आवश्यक लागत है।
विकल्प 2: डेटा और मेटाडेटा की तुलना करें
यदि आपको यह पता लगाने में सक्षम होना चाहिए कि पेड़ में कुछ भी नहीं बदला है, न कि केवल फ़ाइल सामग्री, tarनिर्देशिका सामग्री को आपके लिए पैक करने के लिए कहें , तो इसे भेजें md5sum:
$ tar -cf - somedir | md5sum
क्योंकि tarफ़ाइल अनुमतियाँ, स्वामित्व आदि को भी देखता है, यह उन चीज़ों में परिवर्तन का पता लगाएगा, न कि केवल फ़ाइल सामग्री में परिवर्तन।
यह विधि काफी तेज है, क्योंकि यह केवल एक पेड़ के ऊपर से गुजरती है और केवल एक बार हैश प्रोग्राम चलाती है।
findउपरोक्त विधि के साथ के रूप में , tarफाइल के नाम को संसाधित करने जा रहा है ताकि अंतर्निहित फाइल सिस्टम उन्हें वापस लौटाए। यह अच्छी तरह से हो सकता है कि आपके आवेदन में, आप यह सुनिश्चित कर सकते हैं कि आप ऐसा नहीं करेंगे। मैं कम से कम तीन अलग-अलग उपयोग पैटर्न के बारे में सोच सकता हूं जहां ऐसा होने की संभावना है। (मैं उन्हें सूचीबद्ध नहीं करने जा रहा हूं, क्योंकि हम अनिर्दिष्ट व्यवहार क्षेत्र में हो रहे हैं। प्रत्येक फाइल सिस्टम यहां ओएस के एक संस्करण से दूसरे तक भी अलग हो सकता है।)
यदि आप अपने आप को झूठी सकारात्मकता पाते हैं, तो मैं गिल्स के उत्तरfind | cpio में विकल्प के साथ जाने की सलाह दूंगा ।
find .इसके बजाय उपयोग करना सबसे अच्छा हैfind somedir। इस तरह से फ़ाइल नाम समान हैं जब खोजने के लिए विभिन्न पथ-चश्मा प्रदान करते हैं; यह मुश्किल हो सकता है :-)