جست و جوی فایل در لینوکس با دستورات locate و find

find and locate linux

در سیستم لینوکس فایل‌های مختلفی در مسیر‌های متفاوتی وجود دارد. ما به عنوان یک کاربر لینوکس، باید بتونیم فایل‌های مورد نیازمون رو داخل سیستم جست‌و‌جو کرده و به راحتی فایل مورد نظر رو پیدا کنیم. بدین منظور از دو ابزار برای یافتن فایل‌ها در لینوکس استفاده می‌شود: ابزار locate و ابزار find.

ابزار locate نسبت به find ساده‌تر هست و به راحتی می‌تونیم فایل‌های مورد نظر رو با اون پیدا کنیم. از طرفی، ابزار find دارای قابلیت‌های بیشتری هست که به ما در جست‌و‌جوی دقیق‌تر فایل‌ها کمک می‌کند. در ادامه به صورت مختصر با این دو ابزار و برخی از قابلیت‌های اونها آشنا میشیم.

ابزار locate

این ابزار عملیات جست‌و‌جو رو داخل یک پایگاه داده‌ی محلی در سیستم انجام داده و اون دسته از فایل‌هایی که با عبارت وارد شده توسط کاربر تطابق داشته باشن را به عنوان خروجی نمایش میده. برای مثال، قصد داریم نام تمام دستوراتی که با zip شروع میشن رو پیدا کنیم. از اونجا که به دنبال برنامه‌های مرتبط هستیم، بنابراین می‌تونیم فرض کنیم که دستورات باید درون مسیری با نام /bin قرار داشته باشن. پس عبارت زیر رو در خط فرمان وارد می‌کنیم:

locate /bin/zip

خروجی این دستور به صورت زیر هست:

/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit

توجه داشته باشید، پایگاه داده‌ای که ابزار locate در آن عملیات جست‌و‌جو را انجام می‌دهد توسط برنامه‌ای با نام updatedb ایجاد می‌شود. این برنامه روزانه به طور خودکار پایگاه داده مورد نظر را بروز رسانی می‌کند. از آنجا که این پایگاه داده به طور مداوم بروز نمی‌شود، بنابراین فایل‌هایی که اخیراً در سیستم ایجاد شده‌اند، ممکن است در خروجی دستور locate ظاهر نشوند. در این صورت باید خودمان برنامه‌ی updatedb را با سطح دسترسی کاربر root (با وارد کردن sudo در ابتدای دستور) اجرا کنیم تا این پایگاه داده بروز شود. به صورت زیر:

sudo updatedb

پس از اجرای این دستور، پایگاه داده‌ی محلی در سیستم بروز شده و دستور locate تمام فایل‌های مورد نظرتان را به شما نشان خواهد داد.

ابزار find

در حالی که برنامه‌ی locate یک فایل را بر اساس نام اون پیدا میکنه، برنامه‌ی find میتونه یک فایل رو بر اساس ویژگی‌های وارد شده توسط کاربر و مسیرهای مشخص شده پیدا کنه. ابزار find مکانات بیشتری داره که در ادامه با بعضی از اون‌ها آشنا میشیم.

در ساده‌ترین حالت، این ابزار مسیرهایی را از کاربر دریافت کرده و در داخل اون مسیرها عملیات جست و جو رو انجام میده. برای مثال با اجرای دستور زیر، لیست بلندی از تمام فایل‌های موجود در مسیر home کاربر جاری نمایش داده میشه:

find ~

ما می‌تونیم با استفاده از pipe ( | ) خروجی این دستور رو به عنوان ورودی دستور wc در نظر بگیریم تا تعداد این فایل‌ها مشخص بشه:

find ~ | wc -l
# Output:
۲۰۶۰۱۵

از مزایای دستور find این هست که با استفاده از اون می‌تونیم فایل‌هایی که دارای ویژگی یا معیاری خاص هستن رو پیدا کنیم. برای مثال فرض کنید قصد داریم لیست تمام مسیرها (directories) را در مکان home بدست بیاریم. برای اینکار می‌تونیم از دستور زیر استفاده کنیم:

find ~ -type d

در دستور بالا، با اضافه کردن پارامتر type d جست‌و‌جو رو به directory ها محدود کردیم. می‌تونستیم با وارد کردن f بجای d، فقط فایل‌های معمولی رو در این مسیر مشاهده کنیم. فایل‌های دیگه‌ای هم در سیستم لینوکس وجود دارد که توسط دستور find پشتیبانی می‌شوند. شما با مراجعه به man page این ابزار، در قسمت type می‌تونید اونها رو مشاهده کنید.

ما همچنین می‌تونیم بر اساس حجم فایل و پسوند فایل هم جست‌و‌جوی خودمون رو محدود کنیم. برای مثال:

find ~ -type f -name "*.JPG" -size +1M

در دستور بالا با اضافه کردن پارامتر name و الگوی مشخص شده، به دنبال تمام فایل‌هایی هستیم که پسوند JPG دارن. در ادامه با اضافه کردن پارامتر size مشخص کردیم که تنها به دنبال عکس‌هایی هستیم که حجمی بالاتر از ۱ مگابایت دارن. در صورتی که بجای علامت + از علامت – استفاده کنیم، فایل‌هایی با حجم کمتر از ۱ مگابایت در خروجی نمایش داده میشن و اگر از هیچکدام از این علائم استفاده نشه، فایل‌هایی دقیقاً برابر با همان حجم مشخص شده نمایش داده میشن.

چیزی که بیشتر میتونه موقع پیدا کردن فایل‌ها به ما کمک کنه، انجام عملیاتی خاص روی نتایج خروجی هست. دستور find به ما این قابلیت رو میده تا اقداماتی روی نتایج خروجی انجام بدیم. چندین عمل از پیش تعریف شده برای این ابزار وجود داره. در صورتی که عمل مشخصی رو برای find در نظر نگیریم، به صورت پیش‌فرض از عمل print در ابزار find استفاده میشه. برای مثال دو دستور زیر عملکردی مشابه دارن:

find ~
# or
find ~ -print

همچنین با استفاده از delete می‌تونیم نتایج بدست اومده رو حذف کنیم. در مثال زیر قصد داریم تمام فایل‌های پیدا شده با پسوند BAK در مسیر مشخص شده رو حذف کنیم:

find ~ -type f -name "*.BAK" -delete

علاوه بر این اعمال از پیش تعریف شده، خودمون هم می‌تونیم روی نتیجه‌ی خروجی عملیاتی انجام بدیم. بدین منظور از پارامتر exec در ابزار find به صورت زیر استفاده می‌کنیم:

-exec command {} \;

در قسمت command دستور مورد نظر ما نوشته میشه. علامت {} مشخص کننده‌ی نتایج دستور find است و نقطه ویرگول (semicolon) نشان دهنده‌ی پایان دستور هست. برای مثال عبارت زیر عملکردی همانند delete داره:

-exec rm {} \;

با استفاده از پارامتر ok بجای exec، از کاربر برای اجرای هر دستور سؤال میشه:

find ~ -type f -name "foo*" -ok ls -l {} \;

با اجرای دستور بالا، خروجی زیر نمایش داده میشه:

< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt

ما در مثال بالا به جست‌و‌جوی فایل‌هایی پرداختیم که با عبارت foo شروع میشن. در ادامه بر روی نتایج بدست آمده از دستور ls -l استفاده کردیم تا مشخصات اون‌ها را ببینیم. همانطور که مشاهده می‌کنید، در هر مرحله برای نمایش مشاهده‌ی مشخصات فایل‌ها از ما سوال میشه.

به طور کلی ابزار find قابلیت‌های بیشتری نسبت به ابزار locate داره. اما کار با ابزار locate ساده‌تر هست. شما با مشاهده‌ی man page هر کدوم از این دستورات می‌تونید با سایر قابلیت‌های locate و find آشنا بشید.

جوابی بنویسید:

آدرس ایمیل شما به صورت عمومی منتشر نخواهد شد.