প্রকল্প সম্পর্কে

findDupes হল Go-তে লেখা একটি কমান্ড-লাইন ইউটিলিটি যা ফাইলের নামের পরিবর্তে কন্টেন্ট হ্যাশ দ্বারা ডুপ্লিকেট ফাইল শনাক্ত করে, ফলে ভিন্ন নামের কপিগুলোও ধরা পড়ে। এটি এক বা একাধিক ডিরেক্টরি অনুসন্ধান করে এবং কনকারেন্টলি হ্যাশ করে। প্রতিটি ফাইল সম্পূর্ণ পড়ার ঝামেলা এড়াতে স্ক্যানিং প্রক্রিয়াটি কয়েকটি ধাপে সম্পন্ন হয়। প্রথমে এটি রিকার্সিভলি প্রদত্ত রুটগুলো স্ক্যান করে এবং প্রতিটি রেগুলার ফাইলের পাথ ও সাইজ সংগ্রহ করে; যেসব ফাইলের সাইজ অনন্য সেগুলোকে বাদ দেওয়া হয়, কারণ সেগুলোর কোনো অভিন্ন কপি থাকা সম্ভব নয়। অবশিষ্ট ফাইলগুলোর প্রথম ৪ KiB একটি ওয়ার্কার পুলের মাধ্যমে হ্যাশ করা হয় এবং শুধুমাত্র একই প্রিফিক্স হ্যাশ থাকা ফাইলগুলো পুনরায় পড়া হয় এবং SHA-256 দিয়ে সম্পূর্ণ হ্যাশ করা হয়। একই ফুল হ্যাশ থাকা ফাইলগুলোকে ডুপ্লিকেট হিসেবে রিপোর্ট করা হয়। সাইজ এবং প্রিফিক্স চেকগুলো মূলত ফিল্টার হিসেবে কাজ করে, তাই ভিন্ন সাইজ বা প্রিফিক্স হ্যাশ থাকা ফাইলগুলো কখনোই একে অপরের সাথে সম্পূর্ণ হ্যাশ করা হয় না। রুট হ্যান্ডলিং অত্যন্ত সতর্কতার সাথে করা হয়। স্ক্যান করার আগে রুটগুলোকে অ্যাবসলিউট এবং সিমলিঙ্ক-রিসলভড পাথে রূপান্তর করা হয়; বারবার আসা বা ওভারল্যাপিং রুটগুলো (যেমন একই ডিরেক্টরি দুবার দেওয়া, বা একটি ডিরেক্টরি এবং তার সাবডিরেক্টরি) ডিডুপ্লিকেট করা হয়, যার মধ্যে ভিন্ন বানান বা একই সিমলিঙ্ক দিয়ে আসা পাথও অন্তর্ভুক্ত। স্ক্যান করা ডিরেক্টরির ভেতরে পাওয়া সিমলিঙ্কগুলো অনুসরণ করা হয় না, শুধুমাত্র রেগুলার ফাইল সংগ্রহ করা হয় এবং একই হার্ড-লিঙ্কড ফাইলের একাধিক পাথ একবারই সংগ্রহ করা হয়। হ্যাশিংয়ের সময় কোনো ফাইল পড়া না গেলে তা লগ করা হয় এবং এড়িয়ে যাওয়া হয়; যদি কোনো রুট রিসলভ বা স্ক্যান করা না যায়, তবে অন্য রুটের ফাইলগুলো প্রসেস করা হয়, কিন্তু ফলাফল প্রিন্ট করার পর কমান্ডটি একটি এরর রিটার্ন করে। 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-এ রেস-এনাবলড স্যুট রান করে।