فهرست مطالب
هنگام کار روی پروژههای بزرگ، جستجوی یک کلمه یا تابع در میان هزاران فایل سورسکد با ابزارهای قدیمی اغلب معطلکننده میشود. اگر دستور grep را اجرا کنید، سیستم تمام پوشههای سنگین مثل node_modules یا تاریخچه .git را هم اسکن میکند و خروجی شلوغی تحویل میدهد. ابزار ripgrep که در ترمینال با نام rg اجرا میشود، دقیقاً برای حل همین کندی و حذف نتایج اضافه توسعه یافته است.
ابزار ripgrep چه میکند
ابزار ripgrep یک ابزار خط فرمان است که دایرکتوریها را به شکل بازگشتی برای پیدا کردن الگوهای عبارات باقاعده (Regex) جستجو میکند. نقطه قوت اصلی آن، رعایت خودکار قوانین فایل .gitignore است. یعنی نیازی نیست دستورهای پیچیدهای برای مستثنی کردن پوشههای بیلد، کش یا پکیجها بنویسید؛ ripgrep همان فایلهایی را نادیده میگیرد که از دید گیت پنهان کردهاید. علاوه بر این، فایلهای باینری و فایلهای مخفی به طور پیشفرض خوانده نمیشوند تا کار متوقف نماند.
چه کسانی به ripgrep نیاز دارند
توسعهدهندگانی که پروژههای چند دههزار خطی دارند، مدیران سرور که در لاگهای سنگین متن جستجو میکنند و کاربرانی که از ویرایشگرهایی مثل نئووییم و ایمکس به عنوان محیط توسعه استفاده میکنند، بیشترین بهره را از این ابزار میبرند. اگر در طول روز بارها مجبور میشوید در ساختار کد دنبال نام کلاس، تعریف متغیر یا کلیدهای پیکربندی بگردید، این برنامه زمان پاسخ ترمینال را به کسری از ثانیه کاهش میدهد.
روش نصب ripgrep
این ابزار با زبان راست پیادهسازی شده و برای تمام سیستمعاملهای اصلی بستههای آماده دارد. در لینوکس توزیع اوبونتو و دبیان میتوانید از مدیر بسته پیشفرض استفاده کنید:
bashsudo apt install ripgrep
در مک با ابزار Homebrew:
bashbrew install ripgrep
در ویندوز با مدیر بسته Chocolatey یا Scoop:
powershellchoco install ripgrep
توسعهدهندگانی هم که زنجیره ابزار زبان راست را دارند، میتوانند آن را مستقیماً از رجیستری Crates کامپایل کنند:
bashcargo install ripgrep
اگر به معماری و چگونگی دستیابی به چنین سرعتی در زبان راست علاقه دارید، دوره راست از صفر تا برنامهنویس پایههای حافظه امن و همروندی این زبان را بررسی میکند.
اجرای اولین دستور و بررسی خروجی
برای جستجوی یک واژه در پروژه جاری، کافی است دستور rg را همراه کلمه موردنظر تایپ کنید:
bashrg findUser
خروجی به طور خودکار نام فایل و شماره خط را با رنگبندی تفکیک میکند:
textsrc/controllers/user.ts
۴۲: const result = await findUser(userId);
src/services/auth.ts
۱۸:export function findUser(id: string) {
اگر بخواهید فایلهای نادیدهگرفتهشده یا مخفی را هم بررسی کنید، فلگ -u یا --unrestricted این فیلترها را برمیدارد. برای جستجوی عبارت بدون حساسیت به حروف بزرگ و کوچک، آرگومان -i اضافه میشود.
چه چیزهایی را تغییر میدهد
بزرگترین تفاوت ripgrep با ابزارهای نسل قبل در موتور جستجوی موازی و نحوه خواندن حافظه نهفته است. در grep سنتی برای جستجوی بازگشتی و نادیده گرفتن فایلهای گیت، باید ترکیب خط لولهای از find، آرگومانهای exclusion و grep مینوشتید که اجرای آن به پردازش تکرشتهای محدود بود. ripgrep به صورت پیشفرض تمام هستههای پردازنده را به کار میگیرد و از ساختارهای بهینهسازیشده Regex استفاده میکند.
محدودیتهای واقعی ابزار
با وجود مزایای فنی، ripgrep جایگزین کامل تمام رفتارهای ابزارهای کلاسیک یونیکس نمیشود. این ابزار برای پردازش استریمهای متنی نامحدود پایپ مناسب نیست و در سیستمهای امبدد بسیار قدیمی که بستههای مدرن را پشتیبانی نمیکنند، در دسترس نخواهد بود. همچنین رفتار پیشفرض آن در نادیده گرفتن فایلهای پنهان ممکن است گاهی شما را به اشتباه بیندازد؛ به عنوان مثال اگر متنی داخل یک فایل .env باشد، تا زمانی که فلگ --hidden را نگذارید، آن را به عنوان نتیجه به شما نشان نمیدهد.



نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.