برای جستجو در نام و محتویات فایلها در لینوکس چند تا برنامه خوب داریم locate ,find و grep
find
این برنامه برای جستجوی فایل و دایرکتوری هست.
اول سوییچهای مهم این دستور رو میگم بعد چند تا مثال میزنم
- name- عبارت جستجو
- iname- عبارت جستجو بدون در نظر گرفتن کوچیک یا بزرگ بودن حروف
- not- فایلها یا دایرکتوری هایی که حاوی عبارت وارد شده در سوییچ name- یا iname- نباشد لیست شود
- type- فایل جستجو شود یا دایرکتوری به اینصورت که
- f فایل
- d دایرکتوری
- size- فایلهایی که حجم مشخصی داشته باشند به اینصورت که
- c برای بایت
- k برای کیلو بایت
- M برای مگابایت
- G برای گیگابایت
- a- جستجوی فایلهایی که زمانی access time آنها در محدوده زمانی مشخص شده باشد
- m- جستجوی فایلهایی که زمانی modification time آنها یعنی زمانی که محتویات فایل تغییر کرده در محدوده زمانی مشخص شده باشد
- c- جستجوی فایلهایی که زمانی change time آنها یعنی زمانی که متادیتای فایل تغییر کرده در محدوده زمانی مشخص شده باشد
- user- کاربر صاحب فایل
- perm- دسترسی فایل
- exec- اجرای یک دستور روی نتایج جستجو، توجه کنید که اگه برای مثال بخواید دو تا دستور اجرا کنید دستور دوم زمانی اجرا میشه که دستور اول با موفقیت اجرا شده و خطا برنگردونده باشه
این دستور در دایرکتوری جاری فایلهایی که پسوند log دارند رو برمیگردونه
1 |
$ find . -name "*.log" |
عبارت مورد جستجو رو باید بین ' ' یا " " فرار بدید
اگه بخواید کوچیک یا بزرگ بودن log مهم نباشه
1 |
$ find . -iname "*.log" |
اگه فایلهایی رو بخواید که کلمه پسوند log نداشته باشه
1 |
$ find . -not -name "*.log" |
فایلهایی که بیشتر از 700 مگابایت باشن
1 |
$ find . -size +700M |
توجه کنید که سوییچ name- و iname- برنامه find رجکس قبول نمیکنه و glob قبول میکنه یعنی میتونید کارکترهای * و ? رو استفاده
1 |
$ find . -name "*.log" |
لیست فایلهایی که پسوند log یا txt دارند
1 |
$ find . -type f \( -name "*.log" -o -name "*.txt" \) |
سوییچهای جستجو بر اساس زمان access, modification و change مقادیر زیر رو قبول میکنن
- time برای روز
- min برای دقیقه
فایلهایی که زمان access آنها کمتر از یک دقیقه باشد
1 |
$ find . -type f -amin -1 |
فایلهایی که زمان modification آنها کمتر از یک دقیقه باشد
1 |
$ find . -type f -mmin -1 |
فایلهایی که زمان modification آنها بیشتر از 1 روز باشد
1 |
$ find . -type f -mtime +1 |
فایلهایی که زمان modification آنها بین ۵ تا ۲۵ دقیقه پیش باشد
1 |
$ find . -mmin +5 -mmin -25 |
فایلهایی که متعلق به کاربر pepsi هستند
1 |
$ find . -user pepsi |
فایلهای که دسترسی 644 دارند
1 |
$ find . -perm 644 |
جستجوی فایلهای لوگ و تجمیع اونها
1 |
$ find . -name '*.log' -exec cat {} \; > all.log |
جستجوی فایلهای زیپ و استخراج اونها
1 |
$ find . -name '*.tar.gz' -exec tar zxvf {} \; |
{} ادرس فایل هست که به صورت متغیر تو دستور میتونید استفاده کنید
آخر دستور باید یک فاصله و بعد ;\ رو قرار بدید.
locate
از locate فقط برای اینکه ببینید فایل یا دایرکتوری موجود هست یا نه استفاده کنید
سوییچهای مهم
- b- تنها در basename یا عبارت موجود در انتهای هریک از ورودی های دیتابیس جستجو بشه
- e- نمایش فایلها یا دایرکتوری هایی که هنوز وجود دارن، ممکن هست بعد از به روز شدن دیتابیس فایل یا دایرکتوری حذف شده باشه
توجه کنید که که برنامه locate رجکس قبول نمیکنه ولی در عبارت جستجو میتونید از کاراکتر * استفاده کنید، اگه از این کاراکتر استفاده نکنید * به ابتدا و انتهای عبارت مورد جستجو اضافه میشه و به *query* تبدیل میشه
1 2 3 |
$ locate -b '.log' # or $ locate -b '*.log*' |
grep
این برنامه برای جستجوی در محتویات فایلها هست.
سوییچهای مهم
- e- مشخص کردن ورودی، به صورت پیش فرض ورودی هر خط فایل هست نه کل فایل یکجا
- r- دایرکتوری ها هم جستجو شود
- i- کوچک و بزرگ بودن عبارت مشخص شده در e- مهم نباشد
در انتها باید مسیر جستجو رو مشخص کنید
اگه فقط یک ورودی دارید میتونید سوییچ e- رو ندید
توجه کنید که برنامه grep رجکس میگیره پس اگه یک عبارت خاص رو میخواید جستجو کنید فقط همون رو باید مشخص کنید و * نمیخواد
1 2 3 4 5 |
$ grep -ir -e 'import' . # or $ grep -ir -e '.*import' . # or $ grep -ir 'import' . |
میتونید چند عبارت رو هم قرار بدید
1 |
$ grep -r -e 'include' -e 'import' . |
لیست خطوطی که با ; تموم میشن
1 |
$ grep -e ';$' . |