इस प्रोजेक्ट के बारे में

findDupes Go में लिखा गया एक कमांड-लाइन यूटिलिटी है जो फ़ाइल नाम के बजाय कंटेंट हैश द्वारा डुप्लिकेट फ़ाइलों का पता लगाता है, जिससे अलग-अलग नामों वाली प्रतियां भी पकड़ी जाती हैं। यह एक या अधिक निर्देशिकाओं (directories) की खोज करता है और साथ-साथ (concurrently) हैशिंग करता है। स्कैनिंग चरणों में आगे बढ़ती है ताकि हर फ़ाइल को पूरी तरह से पढ़ने से बचा जा सके। सबसे पहले, यह दिए गए रूट्स (roots) के माध्यम से रिकर्सिवली चलता है और प्रत्येक रेगुलर फ़ाइल के पथ और आकार को एकत्र करता है; जिन फ़ाइलों का आकार खोजी गई फ़ाइलों के बीच अद्वितीय होता है, उन्हें हटा दिया जाता है, क्योंकि उनकी कोई समान प्रति नहीं हो सकती। शेष उम्मीदवारों को एक वर्कर पूल द्वारा उनके पहले 4 KiB पर हैश किया जाता है, और केवल वे फ़ाइलें जिनके प्रीफ़िक्स हैश समान होते हैं, उन्हें फिर से पढ़ा जाता है और SHA-256 के साथ पूरी तरह से हैश किया जाता है। समान पूर्ण हैश वाली फ़ाइलों को डुप्लिकेट के रूप में रिपोर्ट किया जाता है। आकार और प्रीफ़िक्स चेक विशुद्ध रूप से फ़िल्टर के रूप में कार्य करते हैं, इसलिए अलग-अलग आकार या प्रीफ़िक्स हैश वाली फ़ाइलों को कभी भी एक-दूसरे के विरुद्ध पूरी तरह से हैश नहीं किया जाता है। रूट हैंडलिंग जानबूझकर सावधानीपूर्वक की गई है। स्कैनिंग से पहले रूट्स को एब्सोल्यूट, सिम्लिंक-रिजॉल्व्ड पथों में परिवर्तित किया जाता है; दोहराए गए या ओवरलैपिंग रूट्स (जैसे एक ही निर्देशिका को दो बार देना, या एक निर्देशिका और उसकी सब-डायरेक्टरी) को डी-डुप्लिकेट किया जाता है, जिसमें अलग-अलग स्पेलिंग या एक ही सिम्लिंक के माध्यम से रिजॉल्व होने वाले पथ शामिल हैं। स्कैन की गई निर्देशिका के अंदर मिलने वाले सिम्लिंक्स का पालन नहीं किया जाता है, केवल रेगुलर फ़ाइलों को एकत्र किया जाता है, और एक ही हार्ड-लिंक्ड फ़ाइल के कई पथों को एक बार एकत्र किया जाता है। हैशिंग के दौरान जिस फ़ाइल को पढ़ा नहीं जा सकता उसे लॉग किया जाता है और छोड़ दिया जाता है; यदि किसी रूट को रिजॉल्व या वॉक नहीं किया जा सकता है, तो अन्य रूट्स के तहत मिली फ़ाइलों को अभी भी प्रोसेस किया जाता है, लेकिन कमांड परिणाम प्रिंट करने के बाद एक त्रुटि (error) देता है। Ctrl-C और SIGTERM सक्रिय स्कैन को रद्द कर देते हैं, जिससे फ़ाइल सिस्टम रीड्स के बीच काम रुक जाता है। डुप्लिकेट समूहों को उनके SHA-256 हैश, फ़ाइल आकार और पथों के साथ प्रिंट किया जाता है; दोहराव योग्य आउटपुट के लिए प्रत्येक समूह के भीतर पथ और स्वयं समूहों को सॉर्ट किया जाता है। फ्लैग्स में स्कैनिंग के दौरान प्रगति के लिए -v/--verbose, समवर्ती हैशिंग वर्कर्स की संख्या के लिए -w/--workers (डिफ़ॉल्ट: CPU की संख्या), हैश, आकार और पथ फ़ील्ड्स के साथ न्यूलाइन-डिलिमिटेड JSON ऑब्जेक्ट्स के लिए --json, stderr पर स्कैन सांख्यिकी के लिए --stats, और --version शामिल हैं। सांख्यिकी में खोजी गई फ़ाइलें, आकार-फ़िल्टर्ड फ़ाइलें, कंटेंट-हैश उम्मीदवार, डुप्लिकेट समूह और डुप्लिकेट फ़ाइलें शामिल हैं; उन्हें stderr पर लिखने से JSON आउटपुट jq जैसे टूल्स में पाइप करने के लिए सुरक्षित रहता है। इंस्टॉलेशन के लिए Go 1.25 या बाद के संस्करण की आवश्यकता होती है और इसे go install github.com/mojotx/findDupes@latest के साथ, या रिपॉजिटरी को क्लोन करके और go install -v ./... चलाकर किया जा सकता है। रिपॉजिटरी में CI और CodeQL वर्कफ़्लो शामिल हैं, और इसका टेस्ट मैट्रिक्स go.mod में घोषित Go संस्करण का उपयोग करके Linux, macOS और Windows पर रेस-इनेबल्ड सूट चलाता है।