
به اشتراک بگذارید

به اشتراک بگذارید
آموزش سرور | بلاگ وبداده
آموزش دستور Find در لینوکس؛ جستجوی حرفهای فایلها
find [مسیر] [شرطها] [اکشن]. اگر مسیری ندهید، از پوشه فعلی شروع میشود. مثلاً find . -name "*.log" یعنی «در پوشه جاری و زیرشاخهها، هر فایلی که نامش به log. ختم میشود را پیدا کن». همین الگوی ساده، پایه تمام مثالهای پیشرفته است.* در الگوها همان wildcard پوسته است؛ برای جلوگیری از تفسیر زودهنگام آن توسط شل، الگو را داخل گیومه بگذارید.
-iname "readme*" هم readme و هم README را مییابد. با -type هم میتوانید نتیجه را به فایل عادی (f)، دایرکتوری (d) یا لینک نمادین (l) محدود کنید.
| گزینه | کار آن | مثال |
|---|---|---|
| -name / -iname | جستجو بر اساس نام (حساس / ناحساس به حروف) | -iname “*.jpg” |
| -type | محدودکردن به نوع (f فایل، d پوشه، l لینک) | -type d |
| -size | فیلتر بر اساس حجم (k، M، G) | -size +100M |
| -mtime / -mmin | زمان تغییر بر حسب روز / دقیقه | -mtime -7 |
| -user / -group | مالک یا گروه فایل | -user www-data |
| -perm | مجوز دسترسی فایل | -perm 0777 |
| -maxdepth | محدودکردن عمق جستجو | -maxdepth 2 |
| -exec / -delete | اجرای دستور روی نتایج / حذف آنها | -exec rm {} + |
| معیار | find | locate |
|---|---|---|
| روش کار | پیمایش زنده فایلسیستم | جستجو در پایگاهداده از پیشساخته |
| بهروز بودن | همیشه لحظهای و دقیق | وابسته به آخرین updatedb (معمولاً روزانه) |
| سرعت | کندتر روی درختهای بزرگ | بسیار سریع |
| فیلترها | بسیار غنی (حجم، زمان، مجوز، اجرا) | عمدتاً بر اساس نام |
find فایلسیستم را بهصورت زنده میگردد و نتیجهاش همیشه بهروز است اما کندتر است؛ locate در یک پایگاهداده از پیشساخته جستجو میکند و بسیار سریع است اما ممکن است فایلهای اضافهشده پس از آخرین بهروزرسانی پایگاهداده را نشان ندهد. برای جستجوی دقیق و شرطهای پیچیده find و برای یافتن سریع نام، locate مناسب است.
بهجای -name از -iname استفاده کنید. برای نمونه find . -iname "backup*" هم backup و هم Backup و BACKUP را پیدا میکند.
از گزینه -size با علامت + استفاده کنید؛ مثلاً find / -type f -size +500M فایلهای بزرگتر از ۵۰۰ مگابایت را در کل سیستم مییابد. واحدها k برای کیلوبایت، M برای مگابایت و G برای گیگابایت هستند.
بله، با گزینه -delete یا با -exec rm {} +. اما این کار برگشتناپذیر است. روش امن این است که ابتدا فرمان را بدون -delete اجرا کنید، خروجی را با دقت ببینید و تنها پس از اطمینان، گزینه حذف را در انتهای فرمان اضافه کنید. تهیه بکاپ پیش از حذف انبوه ضروری است.
یعنی کاربر فعلی اجازه خواندن برخی پوشهها را ندارد. میتوانید فرمان را با sudo اجرا کنید یا با افزودن 2>/dev/null به انتهای دستور، این پیامها را پنهان کنید تا فقط نتایج معتبر نمایش داده شوند.
با \; دستور یکبار برای هر فایل اجرا میشود؛ پس اگر هزار فایل پیدا شود، هزار بار دستور صدا زده میشود. با + همه فایلها یکجا به دستور داده میشوند که بسیار کارآمدتر است. برای حجم زیاد فایل، حالت + یا ابزار xargs را ترجیح دهید.
از گزینه -maxdepth 1 استفاده کنید؛ مثلاً find . -maxdepth 1 -name "*.conf" فقط در پوشه جاری جستجو میکند. این گزینه باید پیش از شرطهای دیگر نوشته شود.
با گزینه -mtime: عدد منفی یعنی «اخیر» و عدد مثبت یعنی «قدیمیتر». برای نمونه find /var/www -mtime -3 فایلهای تغییریافته در سه روز اخیر را نشان میدهد. برای دقت بر حسب دقیقه از -mmin استفاده کنید.
نسخه GNU این دستور (رایج در اوبونتو، دبیان، CentOS و سایر توزیعهای اصلی) رفتار یکسانی دارد. تفاوتهای جزئی ممکن است در سیستمهای BSD یا macOS دیده شود، اما گزینههای پایهای مثل -name، -type و -size تقریباً همهجا یکساناند.