چگونگی استفاده از فرمان Find و Locate در لینوکس

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

 

پیدا کردن فایل ها بر اساس نام فایل در سرور مجازی

جستجو بر اساس فایل، بدیهی ترین روش پیدا کردن یک فایل است. این را تایپ کنید:

به حروف کوچک و بزرگ حساس است یعنی file با File فرق دارد.
اگر میخواهید بر اساس نام ولی بدون توجه به حروف کوچک و بزرگ باشد، تایپ کنید:

اگر میخواهید همه فایل هایی را بیابید که به الگوی مشخصی پایبند نیستند، میتوانید با استفاده از –not یا ! جستجو را معکوس کنید. اگر از ! استفاده کنید باید کاراکتر را scape کنید تا آن bash سعی نکند قبل از اینکه find بخواهد عمل کند، آن را تفسیر کند:

یا بنویسید:

 

پیدا کردن فایل بر اساس نوع فایل (Type)

 با پارامتر –type میتوانید نوع فایلهایی که دنبالش هستید را مشخص کنید:

 

چندتا از رایج ترین توصیفگر های نوع فایل اینها هستند:

f برای فایلهای معمولی (regular)

d برای دایرکتوری

l برای پیوندهای نمادین

c برای دستگاه کاراکتری

b برای دستگاه بلوکی

مثلاً اگر بخواهیم تمام دستگاه های کاراکتریِ سیستم را پیدا کنیم:

 

پیدا کردن همه فایل هایی که به .conf ختم میشوند:

 

فیلتر کردن جستجو با زمان و سایز

فرمان find راه های متنوعی برای فیلتر کردن نتایج بر اساس زمان و سایز فایل در اختیارتان میگذارد.
سایز
با استفاده از پارامتر –size میتوانید بر اساس سایز فایل، نتایج را فیلتر کنید. در انتهای مقدار عددِ داده شده برای سایز، پسوندی اضافه میکنیم که واحد شمارش را نشان میدهد. بعضی از محبوب ترین ها عبارتند از:
c برای بایت
k برای کیلوبایت
M برای مگابایت
G برای گیگابایت
b برای بلوک های ۵۱۲ بایتی
برای یافتن تمام فایلهایی که دقیقاً ۵۰ بایت هستند:
find / -size 50c
برای پیدا کردن تمام فایلهایی که زیر ۵۰ بایت هستند:
find / -size -50c
اگر بخواهیم همه فایلهایی که بیش از ۷۰۰ مگابایت هستند را بیابیم:

 

زمان

لینوکس داده های زمانی درباره زمان دستیابی، زمان اصلاح و زمان تغییر را نگه میدارد.
زمان دستیابی (Access Time): آخرین باری که یک فایل خوانده یا نوشته شده است.
زمان اصلاح (Modification Time): آخرین باری که محتویات یک فایل اصلاح شده است.
زمان تغییر (Change Time): آخرین باری که متادیتاهایِ آینودِ (inode) یک فایل تغییر داده شده است.
با پارامترهای –atime و –mtime و –ctime میتوان از اینها استفاده کرد. همانگونه که در مورد سایز انجام دادیم، اینجا هم نمادهای مثبت و منفی، برای نشان دادن بزرگتر و کوچکتر استفاده میشوند.
مقدار این پارامترها مشخص میکند چند روز قبل را میخواهید جستجو کنید.
برای یافتن فایلهایی که زمان اصلاحشان یک روز قبل است:

اگر بخواهیم فایلهایی را پیدا کنیم که در کمتر از یک روز گذشته به آنها دسترسی انجام شده، تایپ میکنیم:

برای بدست آوردن فایلهایی که متادیتاهایشان در قبل از سه روز گذشته تغییر کرده است، تایپ کنید:

همچنین پارامترهای همراه دیگری هم هستند که با آنها میتوانیم بجای روز، از دقیقه استفاده کنیم:

که فایلهایی را مشخص میکند که در یک دقیقه گذشته اصلاح شده اند.
همچنین فرمان find میتواند با فایلی مرجع، مقایسه انجام دهد و آنهایی که جدیدتر هستند را بیابد:

 

پیدا کردن فایل ها بر اساس مالک (owner) و اجازه ها (permissions)

 همچنین میتوانید بر اساس مالک فایل یا گروه به دنبال فایل ها بگردید. برای اینکار به ترتیب از پارامترهای –user و –group استفاده کنید. برای پیدا کردن فایلی که مالکش syslog است باید تایپ کنید:

به همین طریق میتوانید فایلهایی که مالکشان گروه shadow است را مشخص کنید:

میتوانیم بر اساس اجازه های خاصی به جستجوی فایلها در سرور مجازی بپردازیم. اگر بخواهیم مجموعه دقیق و مشخصی از اجازه ها را تطابق دهیم، تایپ میکنیم:

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

که هر فایلی که هم آن اجازه ها را دارد و هم اجازه های دیگری دارد را مشخص میکند. در مثال بالا، فایلی با ۷۴۴ اجازه هم پیدا خواهد شد.

 

فیلتر کردن با عمق (Depth)

 برای این بخش، یک ساختار دایرکتوری را در یک دایرکتوری موقتی ایجاد میکنیم. این ساختار دارای سه سطح دایرکتوری خواهد بود و در اولین سطح، ده دایرکتوری وجود خواهد داشت. هر دایرکتوری (حتی دایرکتوری موقتی) شامل ده فایل و ده ساب دایرکتوری خواهد بود.

این ساختار را با این فرمان ها ایجاد کنید:

 

با ۱s و cd میتوانید ببینید که نظم و ترتیب و ساختارشان چطور است و بعد برگردید به تست دایرکتوری:

 

بعداً به این هم خواهیم پرداخت که چطور  فایلهایی بخصوص را از این ساختار استخراج کنیم ولی اول بیایید مثالی ببینیم از یک جستجوی ساده بر اساس نام:

 

اگر خروجی را به یک شمارشگر pipe کنیم خواهیم دید که ۱۱۱۱ عدد نتیجه وجود دارد:

 

اکثر اوقات، این تعداد نتیجه خیلی بیشتر از آن است که بتواند کمکی به حالمان شود و مفید واقع گردد. پس بیایید نتایج را محدودتر کنیم.

میتوانید مشخص کنید که نسبت به دایرکتوری سطح بالا (top-level، جستجو تا چه عمقی پیش برود:

برای نشان دادن file1 در دایرکتوری های سطح ۱ و بالاتر، باید نهایت عمق را ۲ در نظر بگیرید. چون یکی برای دایرکتوری سطح بالا است و یکی برای دایرکتوری های سطح یک:

 

همانطور که میبینید، این لیست نسبت به لیست قبلی بسیار معقول تر و قابل کنترل تر است.

البته میشود یک حداقل عمق هم مشخص کرد و برای مواردی است که مطمئن هستید همه آن فایلها، مقدار مشخصی از دایرکتوری حاضر پایین تر هستند:

 

میتوان از آن برای پیدا کردن فایلهایی استفاده کرد که در انتهای انشعابات دایرکتوری قرار دارند:

 

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

برای تمرکز بر روی محدوده خاصی از انشعابات، میتوانید پارامترهای حداقل و حداکثر عمق را ترکیب کنید:

ترکیب و اجرای فرمان های find

با استفاده از پارامتر –exec میتوانید یک فرمان کمکی دلخواه را بر روی هرچیزی که find پیدا کرده است در سرور مجازی اجرا کنید. ببینید:

در اینجا، {} به جای فایلهایی است که find پیدا میکند و از \; استفاده میشود تا find بداند که فرمان کجا به پایان میرسد.
مثلاً به مثالی که در قسمت قبل گفتیم برمیگردیم و فایلهایی که ۶۴۴ اجازه دارند را پیدا کرده و اصلاحشان میکنیم تا ۶۶۴ اجازه داشته باشند:


cd ~/test

سپس میتوانیم اجازه های دایرکتوری را تغییر دهیم:

اگر میخواهید نتایج مختلف را با هم زنجیره ای کنید میتوانید از فرمان های –and یا –or استفاده کنید. وقتی –and حذف شده باشد، عمل میکند.
find . -name file1 -or -name file9  یافتن فایل ها با استفاده از Locate  که فرمان locate جایگزینی برای find است و اغلب سریع تر و به آسانی کل فایل سیستم را جستجو میکند.

با apt-get میتوانید این فرمان را نصب کنید:

دلیل سرعت بالاتر locate این است که از پایگاه داده فایل ها در فایل سیستم استفاده میکند.
پایگاه داده معمولاً روزی یک بار با اسکریپت cron آپدیت میشود ولی میتوانید دستی هم آن را آپدیت کنید:

همین حالا این فرمان را اجرا کنید و به خاطر داشته باشید که اگر میخواهید فایل هایی که اخیراً به دست آمده یا ایجاد شده اند را بیابید، باید پایگاه داده همیشه به روز باشد.
برای یافتن فایل ها با locate از این سینتکس استفاده کنید:

با بعضی روش ها میتوان خروجی را فیلتر کرد. مثلاً برای یافتن فایل هایی که خودشان شامل جستجو میشوند نه دایرکتوری هایی که به فایل منتهی میشوند، از –b استفاده کنید تا فقط basename را جستجو کند:

برای اینکه فقط نتایجی locate بشوند که هنوز هم در فایل سیستم هستند (یعنی از آخرین آپدیت دیتابیس به این سو حذف نشده اند) از پرچم –e استفاده کنید:

برای دیدن آماری از اطلاعاتی که locate در سرور مجازی فهرست بندی کرده است از آپشن –S استفاده کنید:

 

نتیجه

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

هردو فرمان های قدرتمندی هستند که در ترکیب با سایر ابزارها در خطوط لوله حتی قوی تر هم میشوند. با استفاده از فرمان هایی همچون wc و sort و grep فیلتر کردن نتایج را آزمایش و تجربه کنید.