عن المشروع

findDupes هي أداة مساعدة لسطر الأوامر مكتوبة بلغة Go تحدد موقع الملفات المكررة من خلال بصمة المحتوى بدلاً من اسم الملف، بحيث يتم اكتشاف النسخ ذات الأسماء المختلفة. تقوم الأداة بالبحث في دليل واحد أو أكثر وإجراء التجزئة (hashing) بشكل متزامن. تتم عملية الفحص على مراحل لتجنب قراءة كل ملف بالكامل. أولاً، تقوم الأداة بالمرور العودي (recursively) على الجذور المقدمة وجمع المسار والحجم لكل ملف عادي؛ ويتم استبعاد الملفات التي يكون حجمها فريداً بين الملفات المكتشفة، حيث لا يمكن أن يكون لها نسخة مطابقة. يتم تجزئة المرشحين المتبقين عبر أول 4 KiB بواسطة مجموعة من العمال (worker pool)، وفقط الملفات التي تشترك في بصمة البادئة تلك يتم قراءتها مرة أخرى وتجزئتها بالكامل باستخدام SHA-256. يتم الإبلاغ عن الملفات التي لها نفس البصمة الكاملة كملفات مكررة. تعمل فحوصات الحجم والبادئة كمصفيات بحتة، لذا لا يتم أبداً تجزئة الملفات ذات الأحجام أو بصمات البادئة المختلفة بالكامل مقابل بعضها البعض. يتم التعامل مع الجذور بعناية مدروسة. يتم تحويل الجذور إلى مسارات مطلقة ومحلولة الروابط الرمزية (symlink-resolved) قبل الفحص؛ ويتم إزالة تكرار الجذور المتكررة أو المتداخلة (مثل نفس الدليل المعطى مرتين، أو دليل ودليله الفرعي)، بما في ذلك التهجئات المختلفة أو المسارات التي تؤدي إلى نفس الرابط الرمزي. لا يتم اتباع الروابط الرمزية التي يتم مواجهتها داخل دليل ممسوح ضوئياً، بل يتم جمع الملفات العادية فقط، ويتم جمع المسارات المتعددة لنفس الملف المرتبط برابط صلب (hard-linked) مرة واحدة. يتم تسجيل الملف الذي لا يمكن قراءته أثناء التجزئة وتخطيه؛ وإذا تعذر حل جذر أو المرور فيه، فسيتم الاستمرار في معالجة الملفات الموجودة تحت جذور أخرى، لكن الأمر يعيد خطأً بعد طباعة النتائج. يؤدي Ctrl-C و SIGTERM إلى إلغاء الفحص النشط، مع توقف العمل بين قراءات نظام الملفات. تُطبع المجموعات المكررة مع بصمة SHA-256 وحجم الملف والمسارات؛ ويتم فرز المسارات داخل كل مجموعة والمجموعات نفسها للحصول على مخرجات قابلة للتكرار. تتضمن الأعلام -v/--verbose لمتابعة التقدم أثناء الفحص، و -w/--workers لعدد عمال التجزئة المتزامنين (الافتراضي: عدد وحدات المعالجة المركزية)، و --json لكائنات JSON مفصولة بأسطر جديدة مع حقول البصمة والحجم والمسارات، و --stats لإحصائيات الفحص على stderr، و --version. تغطي الإحصائيات الملفات المكتشفة، والملفات المصفاة حسب الحجم، ومرشحي بصمة المحتوى، والمجموعات المكررة والملفات المكررة؛ وكتابتها في stderr تحافظ على مخرجات JSON آمنة للتمرير إلى أدوات مثل jq. يتطلب التثبيت إصدار Go 1.25 أو أحدث ويمكن القيام بذلك باستخدام go install github.com/mojotx/findDupes@latest، أو عن طريق استنساخ المستودع وتشغيل go install -v ./.... يتضمن المستودع سير عمل CI و CodeQL، وتقوم مصفوفة الاختبار الخاصة به بتشغيل مجموعة الاختبار مع تمكين كشف السباق (race-enabled) على Linux و macOS و Windows باستخدام إصدار Go المعلن عنه في go.mod.