۱۳۸۸/۰۶/۲۸

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

سلام :)

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

۱- دستور locate


دستور locate یکی از سریع ترین راه های یافتن فایل های مختلف در لینوکس است. ساده ترین نوع استفاده از آن را در زیر مشاهده می کنید:
$ locate filename

یا
$ locate "*.html"

یکی از ضعف های این دستور، عدم جستجو در فایل سیستم های مانت شده ویندوز است. به عبارت دیگر این دستور به صورت پیش فرض پارتیشن ویندوزی من را برای یافتن فایل جستجو نمی کند.
در صورت زیاد بودن نتایج جستجو، از پارامتر n دستور locate برای ایجاد محدودیت استفاده نمایید:
$ locate "*.php" -n 10

و نیز می توانید نتایج را با دستورات less یا more ترکیب کنید:
$ locate "*.php" | more

نکته: در هنگام استفاده از locate برای نخستین بار ممکن است با پیغام خطای مروبوط به عدم وجود پایگاه داده مواجه شوید. برای رفع این مشکل از دستور زیر برای بروز کردن پایگاه داده استفاده نمایید:
$ sudo updatedb

۲- دستور find


find یکی از انعطاف پذیرترین  و قوی ترین دستورات برای جستجوی فایل هاست. در زیر ساده ترین ساختار استفاده از دستور find آمده است:
$ find  / -name 'index.php'

دستور بالا تمامی فایل های index.php موجود در پارتیشن ریشه (/) و زیر شاخه های آن را نمایش می دهد.
درصورتی که به خطای اجازه دسترسی در جستجو برخورد کردید، با اضافه کردن 2>/dev/null آن را نادیده بگیرید. همچنین می توانید با اضافه کردن 2>errors.txt آن خطا ها را در فایل errors.txt ذخیره نمایید:
$ find  / -name 'index.php' 2>/dev/null
$ find / -name 'index.php' 2>errors.txt

در ادامه برخی از کاربرد های دستور find را بررسی می کنیم.
$ find /home/saeid -name 'index*'
$ find /home/saeid -iname 'index*'

دستور اول در بالا تمامی فایل هایی را که با عبارت index شروع شده و در دایرکتوری /home/saeid هستند را نمایش می دهد.
دستور دوم، عملکردی مشابه با دستور اول دارد، با این تفاوت در این دستور اندازه حروف (بزرگی و کوچکی) آنها در نظر گرفته نمی شود. یعنی فایل هایی مانند InDex.php یا iNDEX نیز در نتایج دیده می شوند.
$ find -name s*

دستور بالا تمامی فایل ها و دایکتوری هایی را که با حرف s شروع شده و در دایکتوری جاری می باشند را نمایش می دهد.
$ find /home/saeid/Music -name '*.mp3' -size -5000k
$ find / -size +10000k

دستور اول تمامی فایل های mp3 موجود در دایکتوری /home/saeid/Music که کمتر از ۵۰۰۰ کیلوبایت حجم دارند را نمایش می دهد.
دستور دوم تمامی فایل هایی را که بیش از ۱۰۰۰۰ کیلوبایت حجم دارند را نمایش می دهد.
$ find /home/saeid -amin -10 -name '*.php'
$ find /home/saeid -atime -2 -name '*.php'
$ find /home/saeid -mmin -10 -name '*.php'
$ find /home/saeid -mtime -2 -name '*.php'

دستور اول تمامی فایل های php موجود در پوشه خانگی کاربر saeid و زیر شاخه های آن را که در ۱۰ دقیقه اخیر مورد دسترسی قرار گرفته اند را نمایش می دهد.
دستور دوم عملکردی مشابه با دستور اول دارد، با این تفاوت که فایل های مورد دسترسی در ۲ ساعت اخیر را نمایش می دهد.
دستور سوم و چهار عملکردی مشابه با دستور اول و دوم دارند، با این تفاوت که فایل هایی را که در محتوای آنها تغییراتی صورت گرفته است را نمایش می دهند.
$ find / -mount -name 'win*'

دستور بالا تمامی فایل هایی را که با عبارت win شروع شده و در دایرکتوری / بوده و توسط فایل سیستمی مانت (mount) نشده باشند را نمایش می دهد. این دستور زمانی کاربردی تر است که پارتیشن های ویندوزی شما به صورت پیش فرض مانت می شوند و عبارت مورد جستجو (مانند عبارت win) نتایج بسیاری در این پارتیشن ها داشته باشد.
$ find /home/saeid/Music -name 'Metallica*' -and -size +10000k
$ find /home/saeid/Music -size +10000k ! -name "Metallica*"
$ find /home/saeid/Music -name 'Metallica*' -or -size +10000k

عملکرد های شرطی and و or و not دستور find را بسیار انعطاف پذیر می کنند. به عنوان مثال دستور دوم تمامی فایل هایی را که بیش از ۱۰۰۰۰ کیلو بایت حجم داشته و نام آن ها با عبارت Metallica شروع نشده باشد را نمایش می دهد.

گزینه exec یکی از مهمترین ویژگی های دستور find است. با استفاده از این گزینه شما می توانید دستوری را بر روی نتایج جستجو اعمال کنید. نمونه ساده استفاده از این دستور را در زیر مشاهده می کنید:
$ find / - name 'Metallica*' -exec ls -lh {} \;

دستور بالا یک لیست (ls -lh) با جزییات از نتایج جستجو را نمایش می دهد.

۳- دستور whereis


این دستور برای جستجو فایل های اجرایی، منبع و راهنمای یک دستور مورد استفاده قرار می گیرد:
$ wheris nano

۴- دستور which


دستور which برای بدست آوردن آدرس کامل دستور اجرایی مورد استفاده قرار می گیرد. به عنوان مثال خروجی دستور زیر عبارت /usr/bin/nano است.
$ which nano

موفق باشید

۱۲ نظر:

  1. مهندس خواستم بگم با فیدت تو گودر مشکل دارم ... نمی دونم چرا ولی اونهایی که تگ کد می کنی این جوری نشون داده شدن :

    ۳d307240b69095962b71da5b70a23a4e031

    اومدم دیدم تو فید فید برنرت مشکلی نیست ... حالا در کل اومدم بگم شاید لازمت شد ...

    پاسخحذف
  2. این مشکل از پلاگین wp-syntax وردپرس بود که بعد از غیر فعال کردنش، حل شد.
    ممنون بابت اطلاع رسانی :)

    پاسخحذف
  3. [...] هفته سعید زبردست سه چهار تا دستور مفید برای جستجوی فایل‌ها رو معرفی می‌.... قوی شدن توی خط فرمان، چیزیه که لینوکس کارها رو از بقیه [...]

    پاسخحذف
  4. خیلی خوب بود سعید جان :) یه چیز دیگه تو دستور find مسیرجاری هست، مثلا من تو مسیری که هستم رو اگه بخوام بگردم دیگه احتیاجی به تایپ اون نیست کافی هست بنویسم:
    find . -type (f or d) -name file-or-directoryname
    نکته جالب دیگه توانایی انتخاب دایکتوری و یا فایل هست :) موفق باشید.

    پاسخحذف
  5. [...] http://zebardast.ir/%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D9%81%D8%A7%DB%8C%D9%84-%D8%AF%D8%B1-%D9%... a few seconds ago from choqoK [...]

    پاسخحذف
  6. سلام
    خسته نباشید

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

    1 - چه دستوری وجود داره در لینوکس که شبیه به همین find باشه ولی کارش این باشه که بتونه متون داخل فایل ها رو هم بررسی کنه ؟

    2 - حالا چه دستوری وجود داره که بصورت خودکار بتونه این متون رو با متون دلخواه جایگذین کنه همزمان در چندین فایل ؟ ( که دیگه نیاز نباشه خودمون یکی یکی و دستی انجام بدیم )

    خیلی ممنون میشم یا جواب رو ایمیل کنی یا همینجا بنویسی

    پاسخحذف
  7. سلام

    شما می تونید از دستور sed استفاده کنید :)
    چند راهنما:
    http://lowfatlinux.com/linux-sed.html
    http://www.linuxjournal.com/article/7231
    http://linux.about.com/od/commands/l/blcmdl1_sed.htm

    موفق باشید

    پاسخحذف
  8. دستور locate که دوستمون اشاره بهش کرد سریع تر از find عمل میکنه ولی منم همون روش find را پیشنهاد میکنم
    کار دستور locate اینگونه است که نام یا قسمتی از نام فایل مورد نظر را می گیرد و به پایگاه داده ای که نام فایل های موجود در سیستم در آن ذخیره شده مراجعه میکند و ان فایل را پیدا و محل آن را برمی گرداند. اما قبل از استفاده از این دستور باید پایگاه داده ما به روز شده تا آخرین تغییرات را در خود داشته باشد. بروز رسانی پایگاه داده تنها توسط کاربر سطح بالا یعنی root باید انجام گیرد . دستور su برای اینست که کاربر معمولی تبدیل به کاربر سطح بالا شود که البته باید رمز کاربر سطح بالا را بزند. در صورتی که رمز را صحیح وارد کند شکل ظاهری دستور تغییر می کند
    دستور updated برای به روزرسانی پایگاه داده توسط کاربر سطح بالا استفاده می شود. پس از زدن این دستور مدت زمانی برای ثبت آخرین تغییرات در پایگاه داده باید طی شود.
    به جای مراحل فوق دستور زیر نیز کاراست:
    sudo updated
    این دستور نشان میدهد که اگر هنوز کاربر معمولی هستی و رمز کاربر سطح بالا را می دانی میتوانی با وارد کردن رمز اقدام عمل update پایگاه داده کنی.
    پس از مدت زمانی که برای اعمال تغییرات صرف شد میتوانید اقدام به پیدا کردن فایل مورد نظر خود توسط دستور locate کنید

    پاسخحذف