آموزش Linux Essentials- قسمت یازدهم
جستجوی فایلها – find
برای پیدا کردن فایلی که نمیدانید دقیقاً کجا ذخیره کردهاید میتوانید از ابزار find استفاده کنید. این ابزار تمامی دیرکتوری ها را به طور بازگشتی جستجو میکند تا فایل مشابه را پیدا کند. بازگشتی (Recursively) به این معناست که اگر یک دیرکتوری را به آن بدهید، زیر شاخهها، زیر شاخههای آنها و به همین ترتیب را جستجو میکند. خروجی find شامل مسیر فایل هاست، که میتواند به دیگر برنامهها منتقل شود. برای شناخت ساختار این فرمان به مثال زیر توجه کنید:
$ find . -user joe -print./list
این دستور مسیر فعلی را برای یافتن فایلهای متعلق به کاربر joe جستجو میکند.گزینه ی print – در اینجا یک عمل (action) است، که به دستور میگوید نتایج را روی صفحه بنویسد. گرچه اگر عملی را تعیین نکنید دستور find به طور خودکار print را در نظر میگیرد. دستور find به آرگومان هایی هم نیاز دارد.
دیرکتوری شروع
دیدید که یکی از آرگومان های مورد نیاز این دستور، دیرکتوری ای را مشخص میکند که جستجو از آن آغاز میشود. در انتخاب این دیرکتوری باید دقت کافی داشت. برای مثال اگر محل شروع را ریشه (/) در نظر بگیرید، باز هم فایل پیدا میشود، اما جستجو بیشتر طول میکشد. همچنین به مجوز ها نیز دقت کنید و وقت خودتان را صرف جستجو در مکان هایی که مجوزشان را ندارید نکنید.
نکته: اگر به دستور یک مسیر نسبی تحویل بدهید، مسیری که به شما میدهد هم نسبی است و همین موضوع در مورد مسیر قطعی هم صدق میکند. به مثال قبلی توجه کنید.
شما میتوانید به جای یک دیرکتوری، لیستی از چندین دیرکتوری بدهید تا بررسی شوند.
شروط تست
این گزینه ها به دستور میگویند که فایل مورد نظر دارای چه شرایط و نیازمندی هایی است. مهمترین شروط تست در جدول زیر آمده اند:
شرط تست |
توضیحات |
---|---|
-type |
نوع فایل را مشخص میکند( در آینده توضیح داده میشود) b: block device file c: character device file d: directory f: plain file l: symbolic link p: FIFO (named pipe) s: Unix domain socket |
-user |
مشخص میکند که مالک فایل کدام کاربر باشد، میتواند نام کاربری یا UID باشد. |
-group |
تعیین میکند که مالک فایل عضو کدام گروه کاربری است. |
-size |
فایلهایی با سایز مشخص را جستجو میکند.اگر تنها یک عدد بدهید واحد آن یک بلاک ۵۱۲ بایتی در نظر گرفته میشود، واحد بایت و kibibyte هم میتوان استفاده کرد (با اضافه کردن c یا k به انتهای عدد). گذاشتن – یا + قبل از عدد هم باعث میشود فایلهایی با حجم کمتر یا بیشتر از عدد تعین شده جستجو شوند. |
-atime |
بر اساس زمان آخرین دسترسی به فایل جستجو میکند، عددی که به این تست و دوتای بعدی میدهید، بر اساس روز محاسبه میشود. برای استفاده از دقیقه به جای روز، time… را با min… عوض کنید. |
-mtime |
بر اساس آخرین ویرایش فایل |
-ctime |
بر اساس آخرین تغییر inode ( مانند تغییر مجوز، دسترسی به محتویات، تغییر نام، و غیره) |
-perm |
با استفده از این تست تعیین میکنید فایلهای مورد نظر دارای چه مجوزی هستند. این مجوز ها یک عدد در مبنای هشت اند. |
-links |
تعیین میکند فایل موردنظر چه شماره مرجعی دارد. در قسمت ۹ دیدیم که این شماره با ساختن لینک ها تغییر میکند. |
-inum |
جستجو بر اساس inode |
-name |
الگوی نام فایل را مشخص میکند (در قسمتهای قبلی توضح داده شد). با گزینه ی iname- جستجو به کوچک یا بزرگی حروف حساس نمیشود. |
گزینه |
عملگر |
معنا |
---|---|---|
! |
Not |
تستی که بعد از این علامت میآید نباید درست باشد. |
-a |
And |
تست قبل و بعد از این گزینه هر دو باید درست باشند. |
-o |
Or |
حداقل یکی از دو تست قبل و بعد از این گزینه باید درست باشند. |
اگر بخواهیم از چندین تست استفاده کنیم، آنها را با هم And میکنیم. اگر از پرانتز استفاده شد، باید قبل از پرانتز \ بگذارید. یک مثال که فایلهایی که با A شروع میشوند یا دیرکتوری هستند را جستجو میکند:
$ find . \(-type d -o -name “A*” \) -print ./. ./.. ./bilder ./Attic
عملها (Actions)
قبلاً یکی از عملها را دیدید (print-). علاوه بر آن، دو عمل دیگر نیز وجود دارند که دستوراتی را برای فایلها اجرا میکنند. فرق میان این دو، این است که exec- قبل از اجرای فرمان از کاربر تأیید نمیخواهد ولی ok- از کاربر میخواهد که انجام فرمان را تأیید کند.
دستوری که پس از exec- می آید، باید در انتها با ; همراه شود و چون این کاراکتر، یک کاراکتر خاص است، باید با گذاشتن \ پیش از آن، آنرا متمایز کنید.
دو براکت ({}) در دستور با نام فایلی که پیدا شده جایگزین میشود. بهتر است براکت ها را در ' محدود کنید تا با فایلهایی که در اسم آنها فاصله وجود دارد به مشکل بر نخورید.
مثال:
$ find . -user joe -exec ls -l '{}' \; -rw-r--r-- 1 joe users 4711 Oct 4 11:11 file.txt
این مثال فایلهای متعلق به joe را در دیرکتوری فعلی جستجو میکند و برای هر کدام دستور ls -l را اجرا میکند.
مثال:$ find . -atime +13 -exec rm -i '{}' \;
این دستور فایلهایی را که بیش از دو هفته از آخرین دسترسی به آنها گذشته را با اعلان به کاربر (i-) حذف میکند.
نکته:
گاهی اوقات مانند مثال بالا، اجرای پردازش rm برای هر فایل کار غیر مفیدی است، در این شرایط، دستور xargs به کمک ما می آید. به این نمونه توجه کنید:
$ find . -atime +13 | xargs -r rm -i
کاراکتری که قبل از xargs میبینید، خط لوله نام دارد و خروجی یک دستور را به عنوان ورودی به دستور دیگری میدهد، که در این مثال نام فایلهای یافت شده است. Xargs ورودی های خود را تا یک حد مجاز (که قابل تنظیم است) میخواند و آنها را به عنوان آرگومان به دستور میدهد. این عبارات خوانده شده با فاصله جدا میشوند.
نکته:
فایلهای با اسمی عجیب (مانند آنها که دارای فاصله اند)، در استفاده از ترکیب find و xargs دردسر ساز میشوند. راه حل استفاده از print0- به جای print- است که به جای جداسازی با فاصله یا خط جدید، از بایت نول (Null Byte) استفاده میکند که شل با آن به مشکلی بر نخورد. همچنین xargs نیز باید با 0r- به جای r- اجرا شود.
$ find . -atime +13 -print0 | xargs -0r rm -i
تمرین
۱. تمامی فایلهای با حجم بیشتر از ۱ مگابایت را پیدا کنید، و نام آنها را نمایش دهید.
۲. چگونه میتوان با استفاده از find یک فایل با نام غیر عادی (که شل های قدیمی پشتیبانی نمیکنند) را حذف کرد؟
۳. چگونه میتوان مطمئن شد که فایلهای موجود در دیرکتوری tmp/ که متعلق به شماست بعد از خروج از سیستم حذف شده اند؟
جستجوی سریع فایلها – locate و slocate
دستور find قوی اما پیچیده است، همچنین کند است چرا که باید تمام درخت دیرکتوری را طی کند، بنابراین برای کارهای ساده به صرفه نیست. دستور locate یک راه سریعتر است که یک نام فایل یا الگوی نام فایل را میگیرد، و نام آنها را مینویسد.
$ locate letter.txt /home/joe/Letters/letter.txt /home/joe/Letters/grannyletter.txt /home/joe/Letters/grannyletter.txt~
با وجود اهمیت locate، در برخی از توزیعها به طور پیشفرض نصب نشده است.
میتوانید از الگو ها هم استفاده کنید، فقط توجه کنید که locate فایلهایی را پیدا میکند که «کاملا» با الگو مطابق باشند، از ابتدا تا انتها. بنابراین در ابتدای الگو از * استفاده میکنیم:
$ locate "*/letter.t*" /home/joe/Letters/letter.txt /home/joe/Letters/letter.tab
همچنین یادتان باشد که در مواردی که از الگو ها استفاده میکنید، آرگومان را در کوتیشن ها قرار دهید تا شل اقدام به گسترش آنها نکند.
علت سرعت locate، استفاده از دیتابیس ایجاد شده توسط updatedb به جای پیمایش درخت دیرکتوری است. این دیتابیس بسته به برنامه ی cron (که برای برنامهریزی عملیات در سیستم استفاده میشود) در فواصل زمانی مختلف به روز رسانی میشود. برنامه ی cron در لینوکس پیشرفته آموزش داده میشود.
برنامه ی slocate جایگزینی برای locate است. مشکلی که updatedb دارد، این است که به عنوان کاربر ریشه اجرا میشود و تمامی فایلها را در دیتابیس ذخیره میکند. همچنین دسترسی آن محدود است. برنامه ی slocate علاوه بر نام فایل ها، اطلاعات مالک، گروه و مجوز ها را نیز در فایل ذخیره میکند. بنابراین فقط زمانی نام فایل جستجو شده را نمایش میدهد که کاربری که برنامه را اجرا کرده، مجوز دسترسی به فایل را داشته باشد. این برنامه به همراه updatedb نصب میشود. در بسیاری موارد، سیستم به گونهای تنظیم شده که اجرای locate منجر به اجرای slocate میشود.
تمرین
۱. README یک نام فایل متداول است، مسیر کامل تمامی فایلهای README در سیستم را پیدا کنید.
۲. ابتدا فایل جدید را در پوشه خانگی خود ایجاد کنید، سپس
الف) فایل را با locate جستجو کنید.
ب) اکنون updatedb را اجرا و مجدداً جستجو را انجام دهید.
پ) حالا فایل را حذف کنید و مجدداً locate را برای جستجوی فایل استفاده کنید.
۳. بررسی کنید که آیا میتوانید فایل etc/shadow/ را با slocate پیدا کنید؟
دوستان به پایان بخش فایلها رسیدیم. در این بخش قوانین مربوط به نام فایل، الگو های جستجو، لینک ها، عملیات مربوط به فایل، نمایش فایل ها، جستجو و خیلی چیز های دیگر را یاد گرفتید. منتظر قسمت بعدی آموزش باشید!