پیدا کردن فایلها و دایرکتوریها یکی از رایجترین کارها در مدیریت سیستم است. ابزارهای مختلفی برای این منظور در لینوکس وجود دارند که هرکدام برای سناریوهای خاصی طراحی شدهاند. در این بخش، چهار ابزار اصلی برای یافتن فایلها را بررسی میکنیم: find (قدرتمندترین و انعطافپذیرترین)، locate (سریعترین)، which (برای پیدا کردن مسیر دستورات) و whereis (برای پیدا کردن باینری، سورس و صفحات man).
دستور find قدرتمندترین و پرکاربردترین ابزار برای جستجوی فایلها و دایرکتوریها در درخت فایلسیستم است. این دستور بهصورت بازگشتی (Recursive) دایرکتوریها را جستجو میکند و بر اساس معیارهای مختلفی مانند نام، نوع، اندازه، تاریخ تغییر، مجوزها و ... فایلها را پیدا میکند.
ساختار کلی:
find [path] [expression]
path: مسیر شروع جستجو (یک یا چند دایرکتوری).
expression: شامل گزینهها، معیارهای جستجو و اقدامات (Actions) است.
| معیار | توضیح | مثال |
|---|---|---|
-name pattern | جستجو بر اساس نام فایل (Case-Sensitive). | find . -name "*.txt" |
-iname pattern | جستجو بر اساس نام فایل (Case-Insensitive). | find . -iname "readme*" |
-type type | جستجو بر اساس نوع فایل. (f: فایل، d: دایرکتوری، l: لینک سمبلیک) | find . -type d |
-size [+-]n[cwbkMG] | جستجو بر اساس اندازه. | find . -size +10M |
-mtime [+-]n | جستجو بر اساس زمان تغییر (Modification time) بر حسب روز. | find . -mtime -7 |
-atime [+-]n | جستجو بر اساس زمان دسترسی (Access time) بر حسب روز. | find . -atime +30 |
-ctime [+-]n | جستجو بر اساس زمان تغییر وضعیت (Change time) بر حسب روز. | find . -ctime -1 |
-mmin [+-]n | جستجو بر اساس زمان تغییر بر حسب دقیقه. | find . -mmin -5 |
-amin [+-]n | جستجو بر اساس زمان دسترسی بر حسب دقیقه. | find . -amin +60 |
-cmin [+-]n | جستجو بر اساس زمان تغییر وضعیت بر حسب دقیقه. | find . -cmin -10 |
-user username | جستجو بر اساس مالک (Owner). | find . -user root |
-group groupname | جستجو بر اساس گروه. | find . -group admin |
-perm mode | جستجو بر اساس مجوزها. | find . -perm 755 |
-empty | جستجوی فایلها یا دایرکتوریهای خالی. | find . -empty |
-maxdepth n | محدود کردن عمق جستجو. | find . -maxdepth 2 |
-mindepth n | شروع جستجو از عمق مشخص. | find . -mindepth 3 |
-path pattern | جستجو بر اساس مسیر کامل (نه فقط نام فایل). | find . -path "./src/*.js" |
توضیح علامتهای + و - در معیارهای زمانی و اندازهای:
+n: بیشتر از n.
-n: کمتر از n.
n: دقیقاً n.
پس از پیدا کردن فایلها، میتوانید با استفاده از -exec یا -ok بر روی آنها اقدام کنید.
| اقدام | توضیح | مثال |
|---|---|---|
-print | نمایش مسیر فایلها (پیشفرض). | find . -name "*.txt" -print |
-exec command {} \; | اجرای یک دستور روی هر فایل پیدا شده ({} جایگزین فایل میشود). | find . -name "*.tmp" -exec rm {} \; |
-exec command {} + | اجرای دستور با همه فایلهای پیدا شده (کارآمدتر). | find . -name "*.tmp" -exec rm {} + |
-ok command {} \; | مشابه -exec، اما قبل از هر اجرا تأیید میخواهد. | find . -name "*.tmp" -ok rm {} \; |
-delete | حذف فایلهای پیدا شده. | find . -name "*.tmp" -delete |
-ls | نمایش جزئیات فایلها (مشابه ls -l). | find . -name "*.txt" -ls |
نکته مهم: در -exec command {} \;، {} با نام فایل جایگزین میشود و \; پایان دستور را مشخص میکند. در -exec command {} +، {} با لیستی از تمام فایلهای پیدا شده (بهعنوان آرگومان) جایگزین میشود که باعث میشود دستور یک بار (نه بهازای هر فایل) اجرا شود و کارایی بالاتری داشته باشد.
پیدا کردن همهی فایلهای با پسوند .log در دایرکتوری فعلی و زیرشاخهها:
find . -name "*.log"
پیدا کردن فایلها با نام readme (بدون حساسیت به بزرگ/کوچکی):
find . -iname "readme"
پیدا کردن همهی دایرکتوریهای node_modules:
find . -type d -name "node_modules"
پیدا کردن فایلهایی که در ۷ روز اخیر تغییر کردهاند:
find . -type f -mtime -7
پیدا کردن فایلهایی که بیش از ۳۰ روز از دسترسی به آنها گذشته است:
find . -type f -atime +30
پیدا کردن فایلهایی که در ۱۰ دقیقه اخیر تغییر کردهاند:
find . -type f -mmin -10
پیدا کردن فایلهای بزرگتر از ۱۰۰ مگابایت:
find . -type f -size +100M
پیدا کردن فایلهای کوچکتر از ۱ کیلوبایت:
find . -type f -size -1k
پیدا کردن فایلهای با اندازه دقیقاً ۵۰۰ بایت:
find . -type f -size 500c
پیدا کردن فایلهایی که مجوز 755 دارند:
find . -type f -perm 755
پیدا کردن فایلهایی که متعلق به کاربر root هستند:
find . -type f -user root
پیدا کردن فایلهایی که گروه آنها www-data است:
find . -type f -group www-data
find از عملگرهای -and (پیشفرض)، -or و -not پشتیبانی میکند.
پیدا کردن فایلهای .txt یا .log (با -or):
find . -name "*.txt" -or -name "*.log"
پیدا کردن فایلهای .txt که اندازهی آنها کمتر از ۱ مگابایت است (با -and که پیشفرض است):
find . -name "*.txt" -size -1M
پیدا کردن فایلهای .tmp که متعلق به root نیستند (با -not):
find . -name "*.tmp" -not -user root
حذف همهی فایلهای .tmp (با -delete):
find . -name "*.tmp" -delete
(این کار معادل find . -name "*.tmp" -exec rm {} \; است اما سریعتر است و نیازی به فراخوانی rm ندارد.)
تغییر مجوز فایلهای .sh به 755 (با -exec):
find . -name "*.sh" -exec chmod 755 {} \;
تغییر مجوز بهصورت دستهجمعی (با + برای کارایی بهتر):
find . -name "*.sh" -exec chmod 755 {} +
حذف فایلهای خالی:
find . -type f -empty -delete
حذف دایرکتوریهای خالی:
find . -type d -empty -delete
جستجو فقط در دایرکتوری فعلی (عمق ۱):
find . -maxdepth 1 -name "*.txt"
جستجو از عمق حداقل ۲ (نادیده گرفتن دایرکتوری فعلی):
find . -mindepth 2 -name "*.txt"
دستور locate یک ابزار بسیار سریع برای پیدا کردن فایلهاست که از یک پایگاه داده (Database) برای جستجو استفاده میکند. این پایگاه داده معمولاً هر شب با دستور updatedb بهروزرسانی میشود و شامل لیستی از تمام فایلهای سیستم است.
مزیت: locate بسیار سریعتر از find است.
معایب:
فایلهای جدید (که بعد از آخرین بهروزرسانی پایگاه داده ایجاد شدهاند) را پیدا نمیکند.
ممکن است فایلهایی را نشان دهد که حذف شدهاند اما هنوز در پایگاه داده موجود هستند.
ساختار کلی:
locate [option] pattern
| گزینه | توضیح | مثال |
|---|---|---|
-i | جستجوی بدون حساسیت به بزرگ/کوچکی (Case-Insensitive). | locate -i readme |
-c | فقط شمارش تعداد نتایج (Count). | locate -c "*.txt" |
-r regex | جستجو با عبارت منظم (Regex). | locate -r ".*\.conf$" |
-n n | محدود کردن تعداد نتایج به n. | locate -n 10 "*.log" |
-e | فقط فایلهایی که واقعاً وجود دارند را نمایش بده. | locate -e "*.conf" |
پیدا کردن همهی فایلهای .conf:
locate .conf
پیدا کردن فایلهای bashrc (بدون حساسیت به بزرگ/کوچکی):
locate -i bashrc
شمارش تعداد فایلهای .log:
locate -c .log
پیدا کردن ۵ فایل .txt اول:
locate -n 5 .txt
بهروزرسانی پایگاه داده (نیاز به sudo):
sudo updatedb
دستور which برای پیدا کردن مسیر کامل (Absolute Path) یک دستور اجرایی در سیستم استفاده میشود. این دستور، متغیر محیطی PATH را جستجو میکند و اولین مسیری که فایل اجرایی مورد نظر را پیدا کند، نمایش میدهد. (قبلاً در بخش ۱.۴ بهطور کامل توضیح داده شده است.)
ساختار کلی:
which [option] command...
مثال:
which python # خروجی: /usr/bin/python
دستور whereis یک ابزار جامعتر از which است که علاوه بر مسیر فایل اجرایی، مسیر فایلهای سورس (Source) و صفحات man مربوط به یک دستور را نیز نمایش میدهد. (قبلاً در بخش ۱.۴ بهطور کامل توضیح داده شده است.)
ساختار کلی:
whereis [option] command...
مثال:
whereis ls # خروجی: ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
| ابزار | سرعت | دقت | کاربرد اصلی |
|---|---|---|---|
| find | کند (جستجوی لحظهای) | بالا | جستجوی پیشرفته با معیارهای مختلف (زمان، اندازه، مجوز، ...) |
| locate | بسیار سریع (از پایگاه داده) | وابسته به بهروزرسانی پایگاه داده | جستجوی سریع بر اساس نام فایل |
| which | سریع (جستجو در PATH) | بالا | پیدا کردن مسیر دستورات اجرایی |
| whereis | سریع (جستجو در پایگاه داده) | بالا | پیدا کردن باینری، سورس و man یک دستور |
از find استفاده کنید زمانی که:
نیاز به جستجوی پیشرفته بر اساس زمان، اندازه، مجوزها، مالکیت و ... دارید.
میخواهید روی فایلهای پیدا شده اقدام کنید (حذف، تغییر مجوز، ...).
نیاز به دقت و قطعیت دارید و نمیخواهید به پایگاه دادهای متکی باشید.
از locate استفاده کنید زمانی که:
سرعت برایتان اولویت است و میخواهید بهسرعت یک فایل را بر اساس نام پیدا کنید.
پایگاه دادهی سیستم بهروز است (معمولاً در سیستمهای دسکتاپ و سرورها هر شب بهروز میشود).
میدانید که فایل چند روز پیش ایجاد شده است.
از which استفاده کنید زمانی که:
میخواهید بدانید یک دستور (مثل python یا docker) از کدام مسیر اجرا میشود.
میخواهید چندین نسخه از یک دستور را در PATH پیدا کنید (با -a).
از whereis استفاده کنید زمانی که:
علاوه بر مسیر دستور، میخواهید صفحات man یا سورس کد آن را نیز پیدا کنید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات