fd: بديل find السريع والبسيط

fd بديل بسيط وسريع لـ find: Regex افتراضي، smart case، يحترم .gitignore، و-x/-X لتشغيل أوامر على النتائج. الإصدار v10.5.1.

find أداة قوية… بس صيغتها تقيلة، وكثير من الناس بيحفظوا أوامر من Stack Overflow من غير ما يفهموا كل flag. fd (من sharkdp، نفس عائلة ripgrep و bat) اتعمل عشان الحالة دي: بديل بسيط وسريع وودي لـ find، مع defaults معقولة لأغلب الاستخدام اليومي في الشغل على ريبو حقيقي.

أحدث إصدار وقت كتابة المقال: v10.5.1 (نُشر 4 نوفمبر 2026) — release bugfixes على ترخيص Apache-2.0، والمشروع مش archived على GitHub.

ليه fd أصلًا؟

حسب الـ README الرسمي، الفكرة الأساسية: fd PATTERN بدل find -iname '*PATTERN*'. الصيغة أقصر، والـ defaults أقرب للي المطور بيتوقعه لما بيدور جوه مشروع:

  • البحث Regex افتراضيًا، ولو عايز glob استخدم -g
  • Smart case: البحث case-insensitive إلا لو الـ pattern فيه حرف كبير — ساعتها يتحوّل case-sensitive تلقائي
  • يتجاهل الملفات والمجلدات المخفية افتراضيًا
  • يحترم أنماط .gitignore افتراضيًا
  • traversal متوازي (parallelized directory traversal)، وألوان تمييز لأنواع الملفات زي ls
  • الاسم أقصر من find بـ 50٪ (نكتة الـ README… بس صحيحة 😄)

يعني في مشروع Node أو Rust أو Python عادي، fd بيجيبلك اللي بتدور عليه من غير ما تكتب -name و-type و-not -path './node_modules/*' كل مرة. الـ ignore والـ hidden handled من الأول.

أمثلة عملية من الـ README

بحث بسيط — أي entry فيه الجزء ده من الاسم:

fd netfl

Regex يبدأ بـ x وينتهي بـ rc جوه /etc:

fd '^x.*rc$' /etc

كل ملفات Markdown في الريبو الحالي:

fd -e md

أو امتداد مع pattern:

fd -e rs mod

Glob لاسم دقيق (مش substring):

fd -g 'libc.so' /usr

فلترة بالنوع ووقت التعديل — مفيدة جدًا لما بتدور على ملفات اتغيّرت قريب:

fd --type f --changed-within 2d
fd --type d config

لو محتاج تشوف المخفي وتتجاهل قواعد الـ ignore: -u أو -uu (--unrestricted). -u مستوى، و-uu أوسع — راجع الـ help قبل ما تستخدمه على مجلد حساس.

تنفيذ أوامر على النتائج

هنا fd بيبهرني فعليًا، وده اللي بيحوّله من «بحث» لـ «workflow»:

  • -x / --exec: يشغّل الأمر لكل نتيجة بالتوازي
  • -X / --exec-batch: يشغّل الأمر مرة واحدة بكل النتائج كـ arguments

أمثلة مباشرة من الوثائق:

fd -e zip -x unzip
fd -e h -e cpp -x clang-format -i
fd -g 'test_*.py' -X vim
fd -e md -x wc -l

تقدر تتحكم في عدد الـ jobs بـ -j / --threads. وفي الاستخدام الحقيقي، غالبًا أوضح تكتب الـ pattern والمسار قبل -x عشان الـ shell ما يلبسش الـ arguments مع أوامر زي echo. كمان في حالات الحذف (rm) الـ README بينصحك تجرب من غير -X rm الأول، أو تستخدم rm -i.

رأيي

find لسه ضروري لما تحتاج predicates معقدة، أو سكربتات POSIX قديمة، أو سلوك محدد جدًا عبر أنظمة مختلفة. بس لو بتلف على ريبو كل يوم وتدور على امتداد أو اسم، أو عايز تشغّل أمر على مجموعة ملفات بسرعة، fd أسرع في الكتابة وأقل في الأخطاء. حطّه جنب rg و bat في الـ PATH (نفس المؤلف تقريبًا في العقلية: defaults حلوة + سرعة)، وهتحس إن الـ CLI اليومي بقى أوضح.

نصيحة عملية: ابدأ بـ fd -e <ext> و fd PATTERN أسبوع، وبعدين جرّب -x على حاجة innocuous زي wc -l أو ls -l. لما تتعوّد، هترجع لـ find بس لما تحتاج شيئًا fd مش مصمم يعمله.

أسبوع معرض القاهرة للتكنولوجيا… لو رايح، قولنا هتحضر إيه؟ ولو جرّبت fd، قولنا أول أمر هتعمله بيه 👇

المصادر

  • GitHub — sharkdp/fd: https://github.com/sharkdp/fd
  • Release v10.5.1: https://github.com/sharkdp/fd/releases/tag/v10.5.1
  • crates.io — fd-find: https://crates.io/crates/fd-find
  • fd
  • cli
  • find
  • rust
  • devtools
  • opensource