سرور مجازی : چگونگی استفاده از فرمان Find و Locate
مقدمه
وقتی کاربران برای اولین بار با یک سرور مجازیلینوکسی کار میکنند یکی از مشکلاتشان این است که نمیدانند چطور فایلهایی که به دنبالش هستند را پیدا کنند.
در این راهنما توضیح میدهیم چگونه از فرمان find استفاده کنید تا بتوانید در سرور مجازی، فایلها را با فیلترها و پارامترهای مختلف جستجو کنید. همچنین به طور مختصر به فرمان locate خواهیم پرداخت که به روشی متفاوت جستجو میکند.
پیدا کردن فایل ها بر اساس نام فایل در سرور مجازی
جستجو بر اساس فایل، بدیهی ترین روش پیدا کردن یک فایل است. این را تایپ کنید:
find -name "query"
به حروف کوچک و بزرگ حساس است یعنی file با File فرق دارد.
اگر میخواهید بر اساس نام ولی بدون توجه به حروف کوچک و بزرگ باشد، تایپ کنید:
find -iname "query"
اگر میخواهید همه فایل هایی را بیابید که به الگوی مشخصی پایبند نیستند، میتوانید با استفاده از –not یا ! جستجو را معکوس کنید. اگر از ! استفاده کنید باید کاراکتر را scape کنید تا آن bash سعی نکند قبل از اینکه find بخواهد عمل کند، آن را تفسیر کند:
find -not -name "query_to_avoid"
یا بنویسید:
find \! -name "query_to_avoid"
پیدا کردن فایل بر اساس نوع فایل (Type)
با پارامتر –type میتوانید نوع فایلهایی که دنبالش هستید را مشخص کنید:
find -type type_descriptor query
چندتا از رایج ترین توصیفگر های نوع فایل اینها هستند:
f برای فایلهای معمولی (regular)
d برای دایرکتوری
l برای پیوندهای نمادین
c برای دستگاه کاراکتری
b برای دستگاه بلوکی
مثلاً اگر بخواهیم تمام دستگاه های کاراکتریِ سیستم را پیدا کنیم:
find / -type c /dev/parport0 /dev/snd/seq /dev/snd/timer /dev/autofs /dev/cpu/microcode /dev/vcsa7 /dev/vcs7 /dev/vcsa6 /dev/vcs6 /dev/vcsa5 /dev/vcs5 /dev/vcsa4 . . .
پیدا کردن همه فایل هایی که به .conf ختم میشوند:
find / -type f -name "*.conf" /var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf /usr/share/base-files/nsswitch.conf /usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf /usr/share/rsyslog/50-default.conf /usr/share/adduser/adduser.conf /usr/share/davfs2/davfs2.conf /usr/share/debconf/debconf.conf /usr/share/doc/apt-utils/examples/apt-ftparchive.conf . . .
فیلتر کردن جستجو با زمان و سایز
فرمان find راه های متنوعی برای فیلتر کردن نتایج بر اساس زمان و سایز فایل در اختیارتان میگذارد.
سایز
با استفاده از پارامتر –size میتوانید بر اساس سایز فایل، نتایج را فیلتر کنید. در انتهای مقدار عددِ داده شده برای سایز، پسوندی اضافه میکنیم که واحد شمارش را نشان میدهد. بعضی از محبوب ترین ها عبارتند از:
c برای بایت
k برای کیلوبایت
M برای مگابایت
G برای گیگابایت
b برای بلوک های 512 بایتی
برای یافتن تمام فایلهایی که دقیقاً 50 بایت هستند:
find / -size 50c
برای پیدا کردن تمام فایلهایی که زیر 50 بایت هستند:
find / -size -50c
اگر بخواهیم همه فایلهایی که بیش از 700 مگابایت هستند را بیابیم:
find / -size +700M
زمان
لینوکس داده های زمانی درباره زمان دستیابی، زمان اصلاح و زمان تغییر را نگه میدارد.
زمان دستیابی (Access Time): آخرین باری که یک فایل خوانده یا نوشته شده است.
زمان اصلاح (Modification Time): آخرین باری که محتویات یک فایل اصلاح شده است.
زمان تغییر (Change Time): آخرین باری که متادیتاهایِ آینودِ (inode) یک فایل تغییر داده شده است.
با پارامترهای –atime و –mtime و –ctime میتوان از اینها استفاده کرد. همانگونه که در مورد سایز انجام دادیم، اینجا هم نمادهای مثبت و منفی، برای نشان دادن بزرگتر و کوچکتر استفاده میشوند.
مقدار این پارامترها مشخص میکند چند روز قبل را میخواهید جستجو کنید.
برای یافتن فایلهایی که زمان اصلاحشان یک روز قبل است:
find / -mtime 1
اگر بخواهیم فایلهایی را پیدا کنیم که در کمتر از یک روز گذشته به آنها دسترسی انجام شده، تایپ میکنیم:
find / -atime -1
برای بدست آوردن فایلهایی که متادیتاهایشان در قبل از سه روز گذشته تغییر کرده است، تایپ کنید:
find / -ctime +3
همچنین پارامترهای همراه دیگری هم هستند که با آنها میتوانیم بجای روز، از دقیقه استفاده کنیم:
find / -mmin -1
که فایلهایی را مشخص میکند که در یک دقیقه گذشته اصلاح شده اند.
همچنین فرمان find میتواند با فایلی مرجع، مقایسه انجام دهد و آنهایی که جدیدتر هستند را بیابد:
find / -newer myfile
پیدا کردن فایل ها بر اساس مالک (owner) و اجازه ها (permissions)
همچنین میتوانید بر اساس مالک فایل یا گروه به دنبال فایل ها بگردید. برای اینکار به ترتیب از پارامترهای –user و –group استفاده کنید. برای پیدا کردن فایلی که مالکش syslog است باید تایپ کنید:
find / -user syslog
به همین طریق میتوانید فایلهایی که مالکشان گروه shadow است را مشخص کنید:
find / -group shadow
میتوانیم بر اساس اجازه های خاصی به جستجوی فایلها در سرور مجازی بپردازیم. اگر بخواهیم مجموعه دقیق و مشخصی از اجازه ها را تطابق دهیم، تایپ میکنیم:
find / -perm 644
که فایلها را با اجازه هایی که مشخص کردیم تطابق میدهد.
اگر بخواهید فایلهایی را پیدا کنید که حداقل آن همه اجازه دارند، بنویسید:
find / -perm -644
که هر فایلی که هم آن اجازه ها را دارد و هم اجازه های دیگری دارد را مشخص میکند. در مثال بالا، فایلی با 744 اجازه هم پیدا خواهد شد.
فیلتر کردن با عمق (Depth)
برای این بخش، یک ساختار دایرکتوری را در یک دایرکتوری موقتی ایجاد میکنیم. این ساختار دارای سه سطح دایرکتوری خواهد بود و در اولین سطح، ده دایرکتوری وجود خواهد داشت. هر دایرکتوری (حتی دایرکتوری موقتی) شامل ده فایل و ده ساب دایرکتوری خواهد بود.
این ساختار را با این فرمان ها ایجاد کنید:
cd mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10} touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}} cd ~/test
با 1s و cd میتوانید ببینید که نظم و ترتیب و ساختارشان چطور است و بعد برگردید به تست دایرکتوری:
cd ~/test
بعداً به این هم خواهیم پرداخت که چطور فایلهایی بخصوص را از این ساختار استخراج کنیم ولی اول بیایید مثالی ببینیم از یک جستجوی ساده بر اساس نام:
find -name file1 ./level1dir7/level2dir8/level3dir9/file1 ./level1dir7/level2dir8/level3dir3/file1 ./level1dir7/level2dir8/level3dir4/file1 ./level1dir7/level2dir8/level3dir1/file1 ./level1dir7/level2dir8/level3dir8/file1 ./level1dir7/level2dir8/level3dir7/file1 ./level1dir7/level2dir8/level3dir2/file1 ./level1dir7/level2dir8/level3dir6/file1 ./level1dir7/level2dir8/level3dir5/file1 ./level1dir7/level2dir8/file1 . . .
اگر خروجی را به یک شمارشگر pipe کنیم خواهیم دید که 1111 عدد نتیجه وجود دارد:
find -name file1 | wc -l 1111
اکثر اوقات، این تعداد نتیجه خیلی بیشتر از آن است که بتواند کمکی به حالمان شود و مفید واقع گردد. پس بیایید نتایج را محدودتر کنیم.
میتوانید مشخص کنید که نسبت به دایرکتوری سطح بالا (top-level، جستجو تا چه عمقی پیش برود:
find -maxdepth num -name query
برای نشان دادن file1 در دایرکتوری های سطح 1 و بالاتر، باید نهایت عمق را 2 در نظر بگیرید. چون یکی برای دایرکتوری سطح بالا است و یکی برای دایرکتوری های سطح یک:
find -maxdepth 2 -name file1 ./level1dir7/file1 ./level1dir1/file1 ./level1dir3/file1 ./level1dir8/file1 ./level1dir6/file1 ./file1 ./level1dir2/file1 ./level1dir9/file1 ./level1dir4/file1 ./level1dir5/file1 ./level1dir10/file1
همانطور که میبینید، این لیست نسبت به لیست قبلی بسیار معقول تر و قابل کنترل تر است.
البته میشود یک حداقل عمق هم مشخص کرد و برای مواردی است که مطمئن هستید همه آن فایلها، مقدار مشخصی از دایرکتوری حاضر پایین تر هستند:
find -mindepth num -name query
میتوان از آن برای پیدا کردن فایلهایی استفاده کرد که در انتهای انشعابات دایرکتوری قرار دارند:
find -mindepth 4 -name file ./level1dir7/level2dir8/level3dir9/file1 ./level1dir7/level2dir8/level3dir3/file1 ./level1dir7/level2dir8/level3dir4/file1 ./level1dir7/level2dir8/level3dir1/file1 ./level1dir7/level2dir8/level3dir8/file1 ./level1dir7/level2dir8/level3dir7/file1 ./level1dir7/level2dir8/level3dir2/file1 . . .
باز هم بنابر ساختار انشعابات دایرکتوری ما، تعداد نتایج بالاست: هزار نتیجه.
برای تمرکز بر روی محدوده خاصی از انشعابات، میتوانید پارامترهای حداقل و حداکثر عمق را ترکیب کنید:
find -mindepth 2 -maxdepth 3 -name file ./level1dir7/level2dir8/file1 ./level1dir7/level2dir5/file1 ./level1dir7/level2dir7/file1 ./level1dir7/level2dir2/file1 ./level1dir7/level2dir10/file1 ./level1dir7/level2dir6/file1 ./level1dir7/level2dir3/file1 ./level1dir7/level2dir4/file1 ./level1dir7/file1 . . .
ترکیب و اجرای فرمان های find
با استفاده از پارامتر –exec میتوانید یک فرمان کمکی دلخواه را بر روی هرچیزی که find پیدا کرده است در سرور مجازی اجرا کنید. ببینید:
find find_parameters -exec command_and_params {} \;
در اینجا، {} به جای فایلهایی است که find پیدا میکند و از \; استفاده میشود تا find بداند که فرمان کجا به پایان میرسد.
مثلاً به مثالی که در قسمت قبل گفتیم برمیگردیم و فایلهایی که 644 اجازه دارند را پیدا کرده و اصلاحشان میکنیم تا 664 اجازه داشته باشند:
cd ~/test
find . -type f -perm 644 -exec chmod 664 {} \;
سپس میتوانیم اجازه های دایرکتوری را تغییر دهیم:
find . -type d -perm 755 -exec chmod 700 {} \;
اگر میخواهید نتایج مختلف را با هم زنجیره ای کنید میتوانید از فرمان های –and یا –or استفاده کنید. وقتی –and حذف شده باشد، عمل میکند.
find . -name file1 -or -name file9
یافتن فایل ها با استفاده از Locate
فرمان locate جایگزینی برای find است و اغلب سریع تر و به آسانی کل فایل سیستم را جستجو میکند.
با apt-get میتوانید این فرمان را نصب کنید:
sudo apt-get update sudo apt-get install mlocate
دلیل سرعت بالاتر locate این است که از پایگاه داده فایل ها در فایل سیستم استفاده میکند.
پایگاه داده معمولاً روزی یک بار با اسکریپت cron آپدیت میشود ولی میتوانید دستی هم آن را آپدیت کنید:
sudo updatedb
همین حالا این فرمان را اجرا کنید و به خاطر داشته باشید که اگر میخواهید فایل هایی که اخیراً به دست آمده یا ایجاد شده اند را بیابید، باید پایگاه داده همیشه به روز باشد.
برای یافتن فایل ها با locate از این سینتکس استفاده کنید:
locate query
با بعضی روش ها میتوان خروجی را فیلتر کرد. مثلاً برای یافتن فایل هایی که خودشان شامل جستجو میشوند نه دایرکتوری هایی که به فایل منتهی میشوند، از –b استفاده کنید تا فقط basename را جستجو کند:
locate -b query
برای اینکه فقط نتایجی locate بشوند که هنوز هم در فایل سیستم هستند (یعنی از آخرین آپدیت دیتابیس به این سو حذف نشده اند) از پرچم –e استفاده کنید:
locate -e query
برای دیدن آماری از اطلاعاتی که locate در سرور مجازی فهرست بندی کرده است از آپشن –S استفاده کنید:
locate -S Database /var/lib/mlocate/mlocate.db: 3,315 directories 37,228 files 1,504,439 bytes in file names 594,851 bytes used to store database
نتیجه
هر دو فرمان find و locate در روشی خوب برای پیدا کردن فایل ها در سرور مجازی هستند و این بر عهده شماست که بسته به شرایط، روشی که مناسب تر است را انتخاب کنید.
هردو فرمان های قدرتمندی هستند که در ترکیب با سایر ابزارها در خطوط لوله حتی قوی تر هم میشوند. با استفاده از فرمان هایی همچون wc و sort و grep فیلتر کردن نتایج را آزمایش و تجربه کنید.
ترجمه شده توسط: بابک طهماسبی
پست های توصیه شده
آموزش نصب لاراول در سرور دایرکت ادمین
۶ خرداد, ۱۳۹۹