سرور مجازی : چگونگی استفاده از فرمان 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 فیلتر کردن نتایج را آزمایش و تجربه کنید.

 

منبع

ترجمه شده توسط: بابک طهماسبی


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.