fd یک جایگزین سریع، ساده و کاربرپسند برای دستور سنتی find است که با زبان برنامهنویسی Rust نوشته شده است. این ابزار برای رایجترین موارد استفاده از جستجوی فایل، پیشفرضهای هوشمندانهای را ارائه میدهد که کار با آن را بسیار آسانتر میکند.
ویژگیهای کلیدی
-
سینتکس شهودی: برخلاف
findکه نیاز به نوشتن الگوی-iname '*PATTERN*'دارد، درfdکافیست بنویسیدfd PATTERN. این موضوع، بهخصوص برای کاربرانی که تازه با خط فرمان آشنا میشوند، یک مزیت بزرگ محسوب میشود. -
سرعت بالا به کمک پردازش موازی:
fdبا استفاده از قابلیتهای همروندی (Concurrency) در Rust، پیمایش دایرکتوریها را به صورت موازی انجام میدهد که این امر منجر به افزایش قابل توجه سرعت در مقایسه باfindمیشود. در یک بنچمارک مشخص،fdبرای جستجوی یک الگوی خاص در میان حدود یک میلیون فایل، حدوداً ۹ برابر سریعتر ازfind -iregexو ۵ برابر سریعتر ازfind -inameعمل کرده است. -
فیلترهای هوشمند پیشفرض: بهطور پیشفرض،
fd:-
دایرکتوریها و فایلهای مخفی (شروع با
.) را نادیده میگیرد. -
از قوانین فایلهای
.gitignoreپیروی میکند تا فایلهای ناخواسته را از نتایج جستجو حذف کند. -
از «حالت هوشمند حروف بزرگ و کوچک (Smart Case)» استفاده میکند؛ یعنی اگر الگوی شما شامل حروف بزرگ باشد، جستجو به حالت حساس به حروف (Case-Sensitive) تغییر میکند، در غیر این صورت، جستجو بدون در نظر گرفتن حروف انجام میشود.
-
-
خروجی زیبا: نتایج جستجو با رنگهای مختلف برای انواع فایلها نمایش داده میشوند که خوانایی را افزایش میدهد.
دستورات و گزینههای پرکاربرد
| گزینه | توضیح | مثال |
|---|---|---|
-e, --extension | جستجو بر اساس پسوند فایل | fd -e md (همه فایلهای مارکداون) |
-t, --type | جستجو بر اساس نوع (f: فایل، d: دایرکتوری، l: لینک) | fd -td (فقط دایرکتوریها) |
-H, --hidden | شامل کردن فایلها و دایرکتوریهای مخفی در نتایج | fd -H pre-commit |
-I, --no-ignore | نادیده گرفتن فایلهای .gitignore و جستجوی همه فایلها | fd -I numcpu |
-u, --unrestricted | معادل -HI و شامل کردن همه فایلها، حتی مخفی و نادیدهگرفتهشده | fd -u |
-x, --exec | اجرای یک دستور خارجی به ازای هر نتیجه پیدا شده (به صورت موازی) | fd -e log -x wc -l {} |
-X, --exec-batch | اجرای یک دستور خارجی یک بار با تمام نتایج به عنوان آرگومان | fd -e py -X vim |
-g, --glob | استفاده از الگوی glob به جای عبارت منظم (Regex) | fd -g '*.jpg' |
-E, --exclude | حذف فایلها/دایرکتوریهایی که با الگوی glob داده شده مطابقت دارند | fd -E '*.bak' |
مثالهای عملی
-
یافتن تمام فایلهای
jsonدر دایرکتوری فعلی:fd -e json -
یافتن تمام دایرکتوریهای
node_modulesو نمایش آنها:fd -td node_modules -
یافتن فایلهای
logو محاسبه تعداد خطوط هر یک (باxargs-گونه-x):fd -e log -x wc -l
این دستور معادل
find . -name "*.log" -exec wc -l {} \;است اما کوتاهتر و سریعتر. -
یافتن فایلهای
jpgو تبدیل آنها بهpngبا استفاده از placeholderها:fd -e jpg -x convert {} {.}.png
در اینجا
{}مسیر کامل فایل و{.}مسیر بدون پسوند فایل را نشان میدهد.
ripgrep (rg)
ripgrep (دستور: rg) یک ابزار خط فرمان برای جستجوی خطبهخط الگوها در فایلهاست که به عنوان یک جایگزین بسیار سریع و مدرن برای grep طراحی شده است. ripgrep به طور پیشفرض جستجوی بازگشتی را انجام میدهد و از فایلهای .gitignore پیروی میکند که آن را به ابزاری ایدهآل برای جستجو در کد پروژهها تبدیل کرده است.
ویژگیهای کلیدی
-
سرعت فوقالعاده:
ripgrepاغلب به عنوان سریعترین ابزار جستجوی متن معرفی میشود. سرعت آن ناشی از استفاده از موتور عبارت منظم (Regex Engine) بهینهشده در Rust، پشتیبانی از SIMD، و جستجوی موازی است. در یک بنچمارک روی هسته لینوکس،ripgrepتقریباً ۳۳ برابر سریعتر ازgrepدر حالت یونیکد عمل کرده است. -
فیلترهای هوشمند پیشفرض:
ripgrepبهطور پیشفرض:-
فایلهای باینری را برای جلوگیری از خروجیهای بهمریخته، نادیده میگیرد.
-
از قوانین
.gitignoreو.ignoreپیروی میکند. -
فایلها و دایرکتوریهای مخفی را نادیده میگیرد.
-
-
پشتیبانی کامل از یونیکد: برخلاف
grepکه برای حفظ سرعت در برخی موارد نیاز به تغییر locale دارد (LC_ALL=C)،ripgrepهمیشه از یونیکد پشتیبانی میکند بدون اینکه کاهش سرعت قابل توجهی داشته باشد. -
جستجوی هدفمند بر اساس نوع فایل: میتوانید جستجو را محدود به انواع خاصی از فایلها کنید (مانند
-tpyبرای پایتون) یا انواع خاصی را حذف کنید (مانند-Tjsبرای جاوااسکریپت). -
قابلیتهای پیشرفته: پشتیبانی از نمایش متن زمینه (Context) با گزینههای
-A،-Bو-C، شمارش تعداد نتایج (-c)، و جستجو در فایلهای فشرده (-z).
دستورات و گزینههای پرکاربرد
| گزینه | توضیح | مثال |
|---|---|---|
-i, --ignore-case | جستجوی بدون در نظر گرفتن حروف بزرگ و کوچک (Case-Insensitive) | rg -i "error" |
-s, --case-sensitive | جستجوی حساس به حروف بزرگ و کوچک (Case-Sensitive) | rg -s "Error" |
-t, --type | محدود کردن جستجو به نوع خاصی از فایلها | rg -tpy "def main" |
-T, --type-not | حذف نوع خاصی از فایلها از جستجو | rg -Tjson "password" |
-g, --glob | جستجوی فایلهایی که با الگوی glob مطابقت دارند | rg -g '*.rs' "struct" |
-l, --files-with-matches | فقط نام فایلهایی که شامل الگو هستند را نمایش بده | rg -l "TODO" |
-c, --count | نمایش تعداد نتایج در هر فایل | rg -c "error" |
-A, --after-context | نمایش NUM خط بعد از هر نتیجه | rg -A 2 "panic" |
-B, --before-context | نمایش NUM خط قبل از هر نتیجه | rg -B 2 "panic" |
-C, --context | نمایش NUM خط قبل و بعد از هر نتیجه | rg -C 3 "panic" |
-u, --unrestricted | غیرفعال کردن فیلترهای پیشفرض (-uu برای شامل کردن فایلهای مخفی و -uuu برای جستجوی باینریها) | rg -uuu "pattern" |
مثالهای عملی
-
جستجوی عبارت
mainدر همه فایلهای Python یک پروژه:rg -tpy "main"
-
جستجوی کلمه
TODOدر فایلهای جاوااسکریپت و نمایش نام فایلها:rg -Tjs -l "TODO"
-
جستجوی عبارت
errorدر فایلهای لاگ با نمایش ۲ خط قبل و بعد:rg -C 2 "error" /var/log/
-
شمارش تعداد دفعات استفاده از تابع
someFunctionدر فایلهایcpp:rg -tcpp -c "someFunction"
-
غیرفعال کردن همه فیلترها برای جستجوی یک کلمه در همه فایلها (شامل باینریها):
rg -uuu "pattern"
این دستور رفتار
ripgrepرا بهgrepکلاسیک نزدیکتر میکند.
جمعبندی و مقایسه
| ویژگی | fd (برای فایلها) | ripgrep (برای محتوای فایلها) |
|---|---|---|
| کاربرد اصلی | پیدا کردن فایلها بر اساس نام، نوع، مسیر | جستجوی متن درون فایلها بر اساس الگو |
| جایگزین | find | grep, ag, ack |
| نوع جستجوی پیشفرض | عبارت منظم (Regex) بر روی نام فایل | عبارت منظم (Regex) بر روی محتوای فایل |
| فیلترهای پیشفرض | نادیده گرفتن فایلهای مخفی و آیتمهای .gitignore | نادیده گرفتن فایلهای باینری، مخفی و آیتمهای .gitignore |
| پردازش موازی | بله (پیمایش دایرکتوری) | بله (جستجو) |
| قابلیت اجرای دستور | بله (-x, -X) | خیر (با سایر ابزارها ترکیب میشود) |
| مثال | fd -e rs (یافتن همه فایلهای Rust) | rg "fn main" -trs (یافتن fn main در فایلهای Rust) |
هر دو ابزار با در نظر گرفتن نیازهای روزمره توسعهدهندگان و کاربران حرفهای خط فرمان طراحی شدهاند و با ارائه سینتکس سادهتر و سرعت بالاتر، تجربه کاری را به طور قابل توجهی بهبود میبخشند.