وقتی در لینوکس نمیدانید فایلی کجاست یا میخواهید همهٔ لاگهای هفتهٔ اخیر را پیدا کنید، دستور find از نقطهٔ شروع در درخت پوشهها پایین میرود و با آزمونهایی مثل -name و -type نتیجه را چاپ میکند. این آموزش از صفحهٔ رسمی man find(1) روی man7 میآید تا الگوی شروعمسیر + عبارت را درست بچینید، نه با کپیهای خطرناک از اینترنت.
پیشنیازهایی که جا میماند
نقشها را جدا کنید: starting-point پوشهای است که جستوجو از آن آغاز میشود؛ expression مجموعهٔ آزمونها و عملهاست؛ و عمل پیشفرض اگر چیزی ننویسید -print است. گزینههای واقعی -H و -L و -P باید قبل از مسیرها بیایند. الگوهایی مثل *.conf را داخل نقلقول بگذارید تا شل زودتر بازشان نکند. برای نامهای عجیب یا شروعشده با خط تیره، مسیر را با ./ یا مطلق بنویسید.
جستوجو از صفر با گامهای شمارهدار
- یک نقطهٔ شروع امن انتخاب کنید؛ برای تمرین معمولاً پوشهٔ جاری کافی است. مثال: find . -name '*.conf' همهٔ نامهایی که با .conf تمام میشوند را زیر مسیر فعلی میآورد.
- نوع را محدود کنید تا خروجی خلوت شود. برای فقط فایل معمولی: find /var/log -type f -mtime -7 فایلهایی را میدهد که در هفت روز اخیر تغییر کردهاند. برای پوشه: find /home -type d -name 'Downloads'.
- اندازه را فیلتر کنید؛ مثلاً find . -type f -size +100M فایلهای بزرگتر از حدود ۱۰۰ مگابایت را نشان میدهد. واحدها را از man بخوانید (c و k و M و غیره).
- عمق را با -maxdepth ببندید وقتی نمیخواهید تمام درخت را بپیمایید؛ این کار هم سریعتر است هم کمتر Permission denied میبینید.
- قبل از هر حذف یا تغییر، اول همان عبارت را بدون عمل مخرب اجرا کنید تا لیست را ببینید. بعد اگر لازم بود از -print0 با xargs -0 استفاده کنید تا فاصله در نام فایل نشکند: find . -name '*.tmp' -print0 | xargs -0 rm -f.
- برای اجرای یک فرمان روی هر نتیجه از -exec … {} ; استفاده کنید؛ اول روی چند نمونهٔ کمخطر تست کنید. -delete را روی ریشه یا بدون چاپ آزمایشی به کار نبرید.
- رفتار لینک نمادین را بشناسید: پیشفرض -P است و لینک را دنبال نمیکند؛ -L دنبال میکند و روی -type اثر میگذارد. man هشدار میدهد ترکیب -L با عملهایی مثل حذف میتواند گیجکننده شود.
چطور عبارت find چیده میشود
طبق man، آزمونهای مبتنی بر نام (مثل -name) معمولاً زودتر ارزیابی میشوند و -type بعد از آنها میآید. بین آزمونها AND ضمنی است؛ برای OR از -o و پرانتز استفاده کنید و پرانتز را از شل با بکاسلش محافظت کنید. اگر خروجی را برنامهٔ دیگری میخواند، بهجای چاپ معمولی به -print0 فکر کنید.
نکتهٔ امنیتی
هرگز روی / با -delete یا rm بدون خشکاجرا کار نکنید. الگو را نقلقول کنید، خروجی را یکبار با چشم بخوانید، و برای نامهای دارای فاصله از جفت -print0 / xargs -0 استفاده کنید. روی سرور مشترک، جستوجوی گسترده ممکن است بار دیسک بیاورد؛ عمق و مسیر را تنگ بگیرید.
خطاهای رایج
- هیچ نتیجهای نیست: مسیر شروع اشتباه است یا * را شل قبلاً باز کرده است.
- نتیجه خیلی زیاد است: -type یا -maxdepth یا نام دقیقتر اضافه کنید.
- Permission denied زیاد میبینید: یا با دسترسی مناسب اجرا کنید یا آن شاخهها را با -prune کنار بگذارید.
- xargs فایل را نصف میکند: از -print0 غافل شدهاید.
جمعبندی و منبع
نقطهٔ شروع را آگاهانه بگذارید، الگو را نقلقول کنید، با -type و زمان/اندازه تنگ کنید، و قبل از حذف فقط چاپ کنید. مرجع کامل گزینهها همان find(1) در man7.org است. بیشتر دنبال فایل تنظیمات میگردید یا پاکسازی فایلهای موقتی؟
برای عیبیابی سرویس، اول با find فایل تنظیمات یا سوکت را پیدا کنید، بعد سرویس را restart کنید؛ برعکس این ترتیب معمولاً وقت را تلف میکند. وقتی در /etc میگردید، -type f و نام دقیقتر جلوی سیل خروجی را میگیرد.
اگر Permission denied زیاد است، یا با کاربر مناسب اجرا کنید یا شاخههایی مثل /proc را از مسیر شروع کنار بگذارید. روی سرورهای بزرگ، -mtime و -size را زود اضافه کنید تا find تمام دیسک را بیهدف پیمایش نکند.
برای آرشیو لاگهای قدیمی، اول لیست را با -print ببینید، بعد اگر سیاست نگهداری اجازه میدهد حذف یا فشردهسازی را با -exec روی همان فهرست اعمال کنید. هرگز حذف را در همان اولین فرمان آزمایشی قاطی نکنید.
عبارتهای پیچیده با پرانتز را در اسکریپت ذخیره کنید تا نقلقول شل خرابشان نکند. اگر مسیر شروع از متغیر میآید، مطمئن شوید خالی یا ریشهٔ ناخواسته نیست.
مرجع کامل آزمونها و عملها همان find(1) روی man7.org است؛ بهجای حفظ همهٔ فلگها، -name و -type و -mtime را پایه بگیرید و بقیه را موردی از man اضافه کنید.
روی میزکار روزمره، یک عادت خوب این است که فرمانهای find پرکاربرد را در فایل یادداشت یا alias نگه دارید تا هر بار الگو را از صفر نسازید؛ ولی قبل از alias کردن حذف، همان خشکاجرا را دستی یکبار ببینید.