دستور find در لینوکس یک ابزار قدرتمند است که مدیران سیستم به کمک آن میتوانند فایلها و دایرکتوریها را جستجو، مدیریت و پردازش کنند. استفاده صحیح از دستور find میتواند سرعت کار و بهرهوری شما را به طور چشمگیری افزایش دهد. همچنین مدیران سیستم و برنامهنویسها میتوانند از این دستور برای خودکار سازی فرآیندهای پرتکرار استفاده کنند. اگرچه به سادگی میتوان از این دستور برای جستجوی فایلها استفاده کرد، اما به دلیل قابلیتهای مختلفی که دستور find فراهم میکند، استفاده از آن میتواند پیچیده به نظر برسد. در این مقاله از مجله فرادرس خواهیم دید دستور find در لینوکس چیست و چطور باید از آن استفاده کنیم. به عنوان یک کاربر حرفهای لینوکس علاوه بر اینکه این دستور میتواند کارهای روزمره شما را سادهتر کند، در راهنماهای زیادی نیز ممکن است به این دستور برخورد کنید. به همین دلیل آشنایی دقیق با این دستور برای کاربران لینوکس ضروری است.
دستور find به عنوان بخشی از GNU Findutils (+) در تمام توزیعهای لینوکس در دسترس است. پس فارغ از این که از کدام توزیع لینوکس استفاده میکنید، میتوانید از آن به شکلی که در این مقاله خواهید دید استفاده کنید. در این مطلب از مجله فرادرس پس از آشنایی با نحو «Syntax» دستور find در لینوکس نشانهها و قابلیتهای پرکاربرد این دستور را یک به یک معرفی خواهیم کرد. پس از آن مثالهایی از کاربرد این دستور را خواهیم دید.
دستور find در لینوکس چیست؟
دستور find یک ابزار خط فرمان است که کاربران سیستم میتوانند از آن برای جستجو، فیلتر کردن و پردازش فایلها و دایرکتوریها استفاده کنند. این دستور میتواند بر اساس طیف مختلفی از پارامترها مانند نام، نوع، پسوند، حجم، مجوزهای دسترسی، کاربر مالک و … عملیات جستجو را انجام دهد. علاوه بر این که میتوانیم محل ذخیرهسازی فایلهایی با ویژگیهای مختلف را به راحتی با استفاده از این دستور پیدا کنیم، تلفیق دستور find با دستورهای دیگر به مدیران سیستم این امکان را میدهد که عملیاتی مانند کپی کردن، انتقال، حذف یا تغییر مجوزهای دسترسی فایلهایی که با پارامترهای جستجو همخوانی دارند را با تنها یک دستور به سرعت و به سادگی انجام دهند.
نحوه استفاده از دستور find در لینوکس
در این قسمت با نحو «Syntax» دستور find آشنا میشویم و عملکردهای مختلف آن را بررسی میکنیم. پس از معرفی نشانههای مختلفی که میتوانیم از آنها در دستور find استفاده کنیم در قسمت بعد مثالهایی از کاربرد این دستور را خواهیم دید. ممکن است مطالعه نحو دستور و کارکرد نشانههای مختلف در دستور برای بعضی از کاربران دشوار باشد یا ابهاماتی را ایجاد کند، در این صورت توصیه میکنیم پس از بررسی مثالها در قسمت بعدی به این بخش برگردید و کارکرد نشانهها را پس از بررسی مثال آنها مجددا مطالعه کنید.
نحو دستور find
نحو دستور find در لینوکس به این شکل است:
find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]
آرگومانهای مربوط به دستور find را یک به یک در این قسمت بررسی خواهیم کرد.
تعقیب لینکهای نمادین
لینکهای نمادین در لینوکس در واقع فایلهایی هستند که به فایل دیگری اشاره میکنند. این لینکها میتوانند به یک فایل یا یک دایرکتوری اشاره کنند. نشانههای -H
، -L
و -P
رفتار دستور find در مواجهه با لینکهای نمادین را مشخص میکنند. از آنجا که کارکرد این نشانهها با یکدیگر تداخل دارد، تنها یکی از آنها را باید استفاده کرد. در صورتی که بیش از یک نشانه از بین این نشانها استفاده شود، دستور find نشانه سمت راست را ملاک قرار خواهد داد.
نشانه -P
استفاده از این نشانه باعث میشود دستور find هنگام برخورد با لینکهای نمادین در زمان جستجو آنها را تعقیب نکند و صرفا اطلاعات مربوط به لینک را در جستجو به کار ببرد. دستور find در لینوکس به صورت پیشفرض این رفتار را دارد.
نشانه -L
با استفاده از این نشانه دستور find در زمان جستجو همه لینکهای نمادین که با آنها برخورد کند را تعقیب میکند و اطلاعات فایل هدف را برای انجام جستجو به کار میبرد. هنگامی که از این نشانه استفاده میکند نوع فایل لینکهای نمادین به جای لینک، برابر با نوع فایل هدف که لینک به آن اشاره میکند ارزیابی خواهد شد مگر در مورد لینکهایی که فایل هدفشان در دسترس نباشد. نوع فایل برای این لینکها برابر با لینک ارزیابی میشود.
نشانه -H
در صورتی که این نشانه را هراه با دستور find در لینوکس به کار ببرید، این دستور لینکهای نمادین را تعقیب نخواهد کرد، مگر در مواردی که مشخصات فایل نمادین با پارامترهای جستجو همخوانی داشته باشد.
بهینهسازی جستجو
با استفاده از آرگومان -Olevel
میتوانید عملیات جستجو را بهینهسازی کنید تا سریعتر انجام شود. دستور find میتواند ترتیب انجام شدن بررسیهای مختلفی که برای آن تعیین کردهاید را تغییر دهد. مقدار این آرگومان چگونگی اعمال این تغییرات را مشخص میکند. ترتیب انجام آزمونهای مختلف از این جهت حائز اهمیت است که آزمونهایی که ابتدا انجام میشوند تعداد مواردی که لازم است توسط آزمونهای بعدی مورد بررسی قرار بگیرند را محدود میکنند. به همین دلیل معمولا بهتر است آزمونهای پرهزینهتر دیرتر انجام شوند تا بر روی دامنه کوچکتری از رکوردها اعمال شوند. سطوح مختلف بهینهسازی با یک عدد صحیح بین ۱ تا ۳ مشخص میشوند.
سطح ۱
در این سطح که با نشانه -O1
مشخص میشود آزمونهایی که صرفا بر پایه نام فایلها انجام میشوند پیش از آزمونهای دیگر انجام میشوند. این سطح از بهینهسازی سطح پیشفرض دستور find است و برای انتخاب آن نیازی نیست نشانه -O1
را به دستور find در لینوکس اضافه کنید.
سطح ۲
در این سطح آزمونهای -type
یا -xtype
پس از آزمونهای صرفا بر پایه نام فایلها انجام میشوند. اما این آزمونها پیش از هر آزمونی که نیازمند دسترسی به inode باشد انجام میشوند. inode یک ساختار داده است که در سیستم عاملهای مشابه یونیکس فرادادههای مربوط به فایل در آن ذخیره میشود. در سیستم عاملهای امروزی دسترسی به نوع فایل با هزینه کمتری نسبت به دسترسی به inode انجام میشود، برای اجرای دستور find با این سطح بهینهسازی از نشانه -O2
استفاده میکنیم.
سطح ۳
این سطح بالاترین سطح بهینهسازی است و با استفاده از نشانه -O3
میتوانیم آن را فعال کنیم. در این سطح بهینهسازی کامل بر پایه هزینه انجام میشود. به این معنی که هزینه هرکدام از پارامترهای جستجو ارزیابی میشود و آزمونهای کمهزینهتر اول انجام میشوند. همچنین تقدم یا تاخر اجرای آزمونهایی که از نظر هزینه مشابه همدیگر باشند بر اساس احتمال موفقیت آنها مشخص میشود. در صورت استفاده از عملگر منطقی «یا» (با نشانه -o
) آزمونهایی که احتمال موفقیت بیشتری دارند اول انجام میشوند چراکه در صورت موفقیت یک آزمون نیازی به انجام آزمونهای بعدی نیست. به همین ترتیب در صورت استفاده از عملگر منطقی «و» (با نشانه -a
) آزمونهایی که احتمال عدم موفقیت آنها بیشتر است ابتدا انجام میشوند. چون در این صورت نیازی به انجام آزمونهای بعدی نیست.
چاپ کردن اطلاعات دیباگ
در صورت استفاده از نشانه -D
اطلاعات دیباگ مربوط به عملیاتی که توسط دستور find در لینوکس انجام میشوند را در خروجی خواهید دید. در صورتی که دستور find مطابق انتظار شما عمل نکند میتوانید از این اطلاعات برای بررسی علت این موضوع استفاده کنید. همچنین این اطلاعات میتواند به شما در درک بهتر چگونگی کارکرد این دستور کمک کند. برای چاپ کردن اطلاعات دیباگ توسط دستور find پس از نشانه -D
یکی از گزینههای معتبر مربوط به دیباگ را باید بنویسید. این گزینهها و کارکردشان را در جدول زیر میبینیم:
گزینه دیباگ | کارکرد |
exec | نمایش اطلاعات دیباگ مربوط به عملیات -exec
، -execdir ، -ok و -okdir |
opt | نمایش اطلاعات دیباگ مربوط به بهینه سازی درخت عبارات |
rates | نمایش خلاصهای از فراوانی موفقیت یا عدم موفقیت هرکدام از عملیات |
search | چاپ اطلاعات پیمایش درخت دایرکتوری همزمان با انجام عملیات جستجو |
stat | زمانیکه فایلها توسط فراخوانیهای سیستمی stat یا lstat بررسی میشوند پیامی چاپ میکند. ابزار find سعی میکند تا این فراخوانیها را به حداقل برساند |
tree | نمایش درخت عبارات اصلی و درخت عبارات بهینهسازی شده |
all | چاپ همه اطلاعات دیباگ |
help | چاپ راهنمای دیباگ |
به طور مثال اگر بخواهیم راهنمای دیباگ را مشاهده کنیم باید از دستور find به شکل زیر استفاده کنیم:
find -D help
یا اگر بخواهیم تمام اطلاعات دیباگ در خروچی چاپ شود میتوانیم دستوری مانند دستور زیر را در ترمینال بنویسیم:
find -L -D all . -name "*.txt"
مشخص کردن نقطه شروع جستجو
همانطور که در نحو دستور find بالاتر مشخص شده است، در قسمت [path…]
نقطه یا نقاط شروع جستجو را میتوانیم مشخص کنیم. در صورتی که نقطه شروع جستجو مشخص نشده باشد، دستور find دایرکتوری فعال کنونی را به عنوان نقطه شروع جستجو در نظر میگیرد. پس از مشخص شدن نقطه شروع، دستور find به صورت پیشفرض ابتدا تمام فایلها و دایرکتوریهای موجود در نقطه شروع را بررسی میکند و پس از آن محتویات دایرکتوریهای موجود در نقطه شروع را بررسی میکند و در نهایت به همین صورت تمام فایلها وایرکتوریها را بررسی میکند. در صورتی که بخواهیم چند نقطه شروع مختلف را بررسی کنیم آنها را با یک کاراکتر فاصله «space» از یکدیگر تفکیک میکنیم. به طور مثال دستور زیر مسیرهای dir1 و dir2 را برای پیدا کردن فایلهایی با پسوند txt جستجو میکند:
find ./dir1 ./dir2 -name "*.txt"
هنگام مشخص کردن نقطه شروع جستجو به این نکته دقت کنید که در صورتی که مسیر جستجو با کاراکتر نقطه « .
» شروع شود منظور این است که مسیر مشخص شده باید به دایرکتوری فعال کنونی الحاق شود. مثلا اگر هنگام اجرای دستور بالا دایرکتوری فعال کنونی برابر با مسیر /home/user1/
باشد نقاط شروع جستجو برابر با مسیرهای /home/user1/dir1
و /home/user1/dir2
خواهد بود.
عبارات جستجوی دستور find در لینوکس
در نحو دستور find که بالاتر دیدیم آخرین قسمت که به صورت [expression]
مشخص شده است، قسمتی است که عبارات جستجو را در آن مشخص میکنیم. عباراتی که در این قسمت نوشته میشوند مشخص میکنند که چه فایلهایی باید انتخاب شوند و چه عملیاتی بر روی فایلهای انتخاب شده باید انجام شوند. به صورت پیشفرض عملیات -print
بر روی فایلهایی که با عبارت جستجو تطبیق داده شوند انجام میشوند مگر اینکه عملیات دیگری را در عبارات جستجو مشخص کرده باشید. عبارات جستجو در دستور find در لینوکس به ۵ دسته تقسیم میشوند. در این بخش آنها را به ترتیب بررسی خواهیم کرد.
«آزمونها» (Tests)
هر آزمون یک نتیجه صحیح «True» یا غلط «False» را برمیگرداند. این نتیجه بر اساس یکی از ویژگیهای فایل تعیین میشود. در مورد آزمونهایی که یک آرگومان عددی مانند n باید برای آنها مشخص شود میتوانیم آرگومان را به یکی از این سه شکل مشخص کنیم:
- n
: دقیقا برابر با n
- +n
: بیشتر از n
- -n
: کمتر از n
همچنین در آزمونهایی که از عبارت reference در آنها استفاده شده است، به جای عبارت reference باید یک فایل مشخص شود. این آزمونها فایلها را با یک فایل مرجع مقایسه میکنند. دسترسی به فایل مرجع تنها یک مرتبه و در ابتدای اجرای دستور find انجام میشود. چنانچه امکان دسترسی به فایل مرجع وجود نداشته باشد دستور find با یک پیام خطا به کار خود خاتمه میدهد. آزمونهای پرکاربرد در دستور find عبارتند از:
- -amin n
: آخرین دسترسی به فایل دقیقا، بیشتر از یا کمتر از n دقیقه پیش انجام شده است.
- -anewer reference
: زمان آخرین دسترسی به فایل جدیدتر از آخرین دسترسی به فایل مرجع باشد.
- -atime n
: آخرین دسترسی به فایل دقیقا، بیشتر از یا کمتر از n*24 ساعت پیش انجام شده است. دستور find هنگام محاسبه تعداد دورههای ۲۴ ساعته از زمان آخرین دسترسی به فایل قسمت اعشاری نتایج را نادیده میگیرد. به این ترتیب برای این که مثلا آزمون -atime +1
برای یک فایل مقدار صحیح برگرداند، آن فایل باید حداقل ۲ روز قبل برای آخرین بار مورد استفاده قرار گرفته باشد.
- -cmin n
: وضعیت فایل دقیقا، بیشتر از یا کمتر از n دقیقه پیش برای آخرین بار تغییر کرده است.
- -cnewer reference
: زمان آخرین تغییر در وضعیت فایل جدیدتر از همین مشخصه برای فایل مرجع باشد.
- -ctime n
: زمان آخرین تغییر در وضعیت فایل دقیقا، بیشتر از یا کمتر از n*24 ساعت پیش انجام شده باشد.
- -empty
: فایل خالی باشد. میتواند برای فایلهای معمولی یا دایرکتوریها به کار گرفته شود.
- -executable
: برای فایلهایی که توسط کاربری که دستور find را اجرا کرده است، قابل اجرا باشند و یا دایرکتوریهایی که توسط این کاربر قابل جستجو باشند مقدار صحیح برمیگرداند. این آزمون مجوز x را در فهرست مجوزهای دسترسی فایل بررسی میکند.
- -readable
: برای فایلها ودایرکتوریهایی که توسط کاربر اجرا کننده دستور find قابل خواندن باشند مقدار صحیح برمیگرداند.
- -writable
: برای فایلها و دایرکتوریهایی که توسط کاربر اجرا کننده دستور find قابل نوشتن باشند مقدار صحیح برمیگرداند.
- -gid n
: شناسه گروه مالک فایل دقیقا، بیشتر از، یا کمتر از n باشد.
- -group gname
: فایل متعلق به گروهی با نام gname باشد.
- -name pattern
: نام فایل را با یک الگوی شل که در قسمت pattern مشخص میشود، تطبیق میدهد.
- -iname pattern
: مانند آزمون -name
عمل میکند، با این تفاوت که بزرگ یا کوچک بودن حروف را نادیده میگیرد.
- -path pattern
: نام کامل فایل (همراه با مسیر فایل) را با یک الگوی شل که در قسمت pattern مشخص میشود، تطبیق میدهد.
- -ipath pattern
: مانند آزمون -path
عمل میکند، با این تفاوت که بزرگ یا کوچک بودن حروف را نادیده میگیرد.
- -regex pattern
: نام کامل فایل (همراه با مسیر فایل) را با الگوی عبارت باقاعده مشخص شده در قسمت pattern تطبیق میدهد.
- -iregex pattern
: مانند آزمون -regex
با این تفاوت که بزرگ یا کوچک بودن حروف را نادیده میگیرد.
- -mmin n
: محتویات فایل برای آخرین بار دقیقا، کمتر از یا بیشتر از n دقیقه پیش تغییر کرده باشد.
- -mtime n
: محتویات فایل برای آخرین بار دقیقا، کمتر از یا بیشتر از n*24 ساعت پیش تغییر کرده باشد.
- -newer reference
: زمان اعمال آخرین تغییرات در محتویات فایل جدیدتر از اعمال آخرین تغییرات در فایل مرجع باشد.
- -nogroup
: فایل متعلق به هیچ گروه کاربری نباشد.
- -nouser
: فایل متعلق به هیچ کاربری نباشد.
- -perm mode
: بیتهای مشخص کننده مجوزهای دسترسی فایل دقیقا برابر مجوزهای مشخص شده در قسمت mode باشد. مجوزها در قسمت mode میتوانند به صورت رشته در مبنای ۸ و یا نمادین نوشته شوند.
- -perm -mode
: تمام مجوزهای مشخص شده در قسمت mode در بین بیتهای مشخص کننده مجوزهای دسترسی فایل موجود باشند.
- -perm /mode
: حداقل یکی از مجوزهای دسترسی مشخص شده در قسمت mode در بین بیتهای مشخص کننده مجوزهای دسترسی فایل موجود باشد.
- -size n[ckMG]
: فایل دقیقا، کمتر از یا بیشتر از n واحد حافظه را اشغال کند. پسوندهای c و k و M و G به ترتیب به واحدهای بایت، کیلوبایت، مگابایت و گیگابایت را مشخص میکنند.
- -type c
: فایل از نوع c باشد. کاراکتر c نوع فایل را مشخص میکند. به جای آن برای مشخص کردن دایرکتوریها از کاراکتر d، برای مشخص کردن فایلهای معمولی از f و برای مشخص کردن لینکهای نمادین از l استفاده میکنیم.
- -user uname
: فایل متعلق به کاربر uname باشد.
«اقدامات» (Actions)
اقدامات دستهای از عملیات مشخص شده در عبارات جستجو هستند که دارای یک اثر جانبی هستند. مانند نمایش اطلاعات فایل در خروجی یا اعمال تغییراتی در مجوزهای دسترسی فایل. اقدامات بر روی فایلهایی که اجرای آزمون روی آنها مقدار صحیح برگردانده باشد انجام میشوند و یک نتیجه صحیح یا غلط را بر این اساس که با موفقیت انجام شدهاند یا نه برمیگردانند. اقدامات پرکاربرد در دستور find عبارتند از:
- -delete
: فایل ها را حذف میکند. در صورتی که با موفقیت انجام شود مقدار صحیح برمیگرداند.
- -exec command
: دستور مشخص شده در قسمت command را اجرا میکند. تمام آرگومانهای ورودی دستور find پس از این نشانه به عنوان آرگومانهای دستور مشخص شده در قسمت command در نظر گرفته میشوند تا جایی که یکی از آرگومانها به کاراکتر ; ختم شود. همچنین هنگام نوشتن آرگومانهای دستور command هرکجا از رشته {} استفاده کنیم، در هنگام اجرای دستور find نام کامل فایل مورد بررسی به جای {} قرار خواهد گرفت. دستور command از نقطه شروع جستجو اجرا خواهد شد.
- -execdir command
: مانند عملیات -exec
عمل میکند با این تفاوت که دستور command را از دایرکتوری حاوی فایل مورد بررسی اجرا میکند.
- -ls
: اطلاعات فایل مورد بررسی را مطابق با شیوه خروجی دستور ls در لینوکس هنگامی که به صورت ls -dils
اجرا شود، فهرست میکند.
- -print
: نام کامل فایل مورد بررسی را در خروجی چاپ میکند. این عملیات به صورت پیشفرض بر روی فایلهایی که نتیجه اجرای آزمون آنها صحیح باشد اجرا میشود.
- -fprint file
: نام کامل فایل مورد بررسی را در فایل مشخص شده در قسمت file چاپ میکند.
- -fls file
: مانند عملیات -ls
عمل میکند، با این تفاوت که خروجی را در فایل مشخص شده مینویسد.
- -ok command
: مانند عملیات -exec
عمل میکند. با این تفاوت که پیش از اجرای دستور مشخص شده نیازمند تایید کاربر است.
- -okdir command
: مانند عملیات -execdir
عمل میکند با این تفاوت که پیش از اجرای دستور مشخص شده نیازمند تایید کاربر است.
- -prune
: اگر فایل مورد بررسی یک دایرکتوری است از ورود به آن صرف نظر شود.
«گزینههای عمومی» (Global Options)
گزینههای عمومی نحوه انجام آزمونها و اقدامات را در تمام دستور find تحت تاثیر قرار میدهند. به طور مثال گزینه -depth
باعث میشود دستور find درخت دایرکتوریها را به صورت عمق-اول پیمایش کند. گزینههای عمومی پرکاربرد دستور find در لینوکس عبارتند از:
- -depth
: محتویات دایرکتوری پیش از خود دایرکتوری پردازش شوند. اگر اقدام -delete
در دستور به کار رفته باشد، به طور خود به خود این گزینه فعال خواهد شد.
- -maxdepth levels
: حداکثر تا عمق مشخص شده توسط levels (یک عدد صحیح غیر منفی) از دایرکتوری محل شروع جستجو پیمایش شود. مثلا اگر نشانه -maxdepth 0
همراه دستور find در لینوکس استفاده شود آزمونها و اقدامات مشخص شده در دستور تنها برروی فایلها و دایرکتوریهای محل شروع جستجو اعمال خواهند شد.
- -mindepth levels
: هیچ آزمون و اقدامی بر روی فایلها و دایرکتوریهای با عمق کمتر از levels نسبت به محل شروع جستجو اعمال نشود.
- -xdev
: از بررسی دایرکتوریهای ذخیره شده بر روی سایر filesystem ها صرف نظر شود.
«گزینههای محلی« (Positional Options)
گزینههای محلی تنها آزمونها و اقداماتی که پس از آنها نوشته شوند را تحت تاثیر قرار خواهند داد. گزینههای محلی پرکاربرد دستور find در لینوکس عبارتند از:
- -daystart
: در عملیاتی که نیاز به سنجش زمان دارند مبدا مقایسه به جای ۲۴ ساعت قبل، ابتدای روز جاری در نظر گرفته شود.
- -warn
: فعال کردن نمایش پیامهای اخطار.
- -nowarn
: غیرفعال کردن نمایش پیامهای اخطار.
«عملگرها» (Operators)
عملگرها سایر موارد را در عبارات جستجو به یکدیگر پیوند میدهند. در مواردی که عملگر مشخصا قید نشده باشد دستور find در لینوکس به صورت پیشفرض از عملگر «و» با نشانه -a
استفاده میکند. عملگرهای پشتیبانی شده توسط دستور find عبارتند از:
- –not expression
یا ! expression
: معکوس نتیجه expression را برمیگرداند.
- expression1 -a expression2
یا expression1 -and expression2
: تنها در صورتی که هر دو عبارت نتیجه صحیح برگردانند مقدار صحیح برمیگرداند. در صورتی که expression1 مقدار غلط برگرداند، expression2 اجرا نخواهد شد.
- expression1 -o expression2
یا expression1 -or expression2
: در صورتی که حداقل یکی از دو عبارت نتیجه صحیح برگردانند مقدار صحیح برمیگرداند. در صورتی که expression1 مقدار صحیح برگرداند expression2 اجرا نخواهد شد.
- expression1 , expression2
: هر دو عبارت در هر صورت اجرا خواهند شد اما مقداری که عبارت expression2 برمیگرداند در ارزیابی عبارت گستردهتر ملاک قرار میگیرد.
مثالهایی از کاربرد دستور find در لینوکس
تا به اینجا با دستور find و همه امکانات پرکاربرد آن آشنا شدهاید و میدانید دستور find در لینوکس چیست. در این بخش از نشانههایی که در قسمت قبل با آنها آشنا شدیم استفاده میکنیم تا توضیح دهیم چطور با استفاده از دستور find فایلها و دایرکتوریهایی را پیدا کنیم که ویژگی مورد نظرمان را دارند. همچنین خواهیم دید چطور از اقدامات مورد پشتیبانی توسط دستور find برای پردازش فایلها و دایرکتوریهای مورد نظر استفاده میکنیم.
یافتن فایلها با نام یا پسوند
با استفاده از دستور زیر میتوانیم تمام فایلها با نام sources.list
را پیدا کنیم. از آنجا که محل شروع جستجو در دستور زیر برابر با دایرکتوری root مقداردهی شده است، این دستور تمام فایلهای ذخیره شده بر روی سیستم را جستجو میکند:
find / -name "sources.list"
اگر دستور بالا را با کاربری غیر از کاربر root اجرا کنید تعداد زیادی خطای Permission denied
در خروجی خواهید دید. علت این موضوع این است که دستور find تلاش میکند تا محتویات تمام دایرکتوریها را بررسی کند و کاربر شما مجوز دسترسی به همه دایرکتوریها و فایلها را ندارد. اگر میخواهید به وسیله دستور find در لینوکس تمام فایلها و دایرکتوریهای ذخیره شده در سیستم را مورد جستجو قرار دهید باید دستور را به عنوان کاربر root اجرا کنید. در تصویر زیر میبینید که به کمک دستور sudo در لینوکس دستور بالا را اجرا کردهایم:
دقت کنید که نتایج مشخص شده توسط دستور find نام کامل فایلها را نمایش میدهند، به این ترتیب میتوانید مسیر فایل مشخصی که به دنبال آن میگردید را پیدا کنید.
برای انتخاب دایرکتوری فعال کنونی به عنوان محل شروع جستجو توسط دستور find از این دستور به این شکل استفاده میکنیم:
find . -name "file1.txt"
هر مسیر دلخواهی را میتوانیم به عنوان محل شروع جستجو در دستور find انتخاب کنیم. فرض کنید بخواهیم محل ذخیره سازی فایلی با نام sources.list را بیابیم، اما محل ذخیرهسازی آن را فراموش کرده باشیم اما بدانیم این فایل در مسیر /etc
ذخیره شده است. تصویر زیر نحوه فراخوانی دستور find برای یافتن فایل با انتخاب مسیر /etc
به عنوان محل شروع جستجو را نمایش میدهد. دقت کنید که چون دستور به عنوان یک کاربر معمولی اجرا شده است اجازه بررسی بعضی از دایرکتوریها را نداشته است. خطای مربوط به عدم دسترسی به این دایرکتوریها را تصویر میبینید:
در مثال قبل از دستور find برای یافتن فایلی استفاده کردیم که نام آن را میدانستیم. اگر تنها بخشی از نام فایل را بدانیم نیز میتوانیم از دستور find برای یافتن فایلهایی که نام آنها از الگوی مورد نظر ما تبعیت میکند استفاده کنیم. به کمک دستور زیر میتوانیم تمام فایلهایی که نام آنها با عبارت text شروع میشود را پیدا کنیم:
find . -name "text*"
در تصویر زیر ابتدا فایلهای موجود در مسیر ./faradars
را به وسیله دستور ls نمایش دادهایم، پس از آن از دستور find برای یافتن همه فایلهایی که نام آنها با عبارت text شروع میشود استفاده کردهایم:
به همین صورت میتوانیم از دستور find برای یافتن همه فایلها با یک پسوند مشخص استفاده کنیم. مثلا برای یافتن همه فایلها با پسوند txt باید از دستور find به این صورت استفاده کنیم:
find . -name "*.txt"
اگر بزرگ یا کوچک بودن حروف در نام فایلی که به دنبال آن میگردید مطمئن نیستید میتوانید به جای آزمون -name
از آزمون -iname
استفاده کنید. به این ترتیب دستور find به بزرگ یا کوچک بودن حروف اهمیتی نمیدهد. در تصویر زیر میبینید که مثال بالا را با آزمون -iname
تکرار کردهایم. به تفاوت خروجی در دو مثال دقت کنید:
با ترکیب دستور find و سایر دستورهای لینوکس میتوانیم خروجی این دستور را به شیوهای مناسبتر نمایش دهیم. مثلا اگر صرفا بخواهیم تعداد فایلهایی که نام آنها با عبارت text شروع میشود را ببینیم میتوانیم از دستور زیر استفاده کنیم:
find . -type f -name "text*" | wc -l
یا اگر بخواهیم تنها ۳ فایل اول از فهرست خروجی را ببینیم دستور زیر را استفاده میکنیم:
find . -type f -name "text*" | head -n 3
به همین ترتیب به کمک دستور tail میتوانیم ۳ فایل آخر در فهرست خروجی را ببینیم:
find . -type f -name "text*" | tail -n 3
مشخص کردن نوع فایل مورد نظر در دستور find
با استفاده از آزمون -type
میتوانید مشخص کنید که به دنبال چه نوع فایلی میگردید. به طور مثال دستور زیر برای یافتن تمام دایرکتوریهایی که نام آنها با عبارت script شروع میشود استفاده میشود:
find . -name "script*" -type d
و همچنین با استفاده از دستور زیر تمام فایلها با نام مشابه را میتوانیم پیدا کنیم:
find . -name "script*" -type f
در این مثال تصویری از مجله فرادرس، نمونهای از اجرای دستورهای بالا را میبینید:
استفاده از عملگرها در دستور find
با استفاده از دستور زیر میتوانیم تمام فایلها با یکی از پسوندهای txt، pdf یا doc را جستجو کنیم:
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
اجرای یک دستور بر روی تمام فایلهای مورد نظر
در مثال زیر به کمک دستور find، دستور grep -l -i “hi” filename
را بر روی تمام فایلها اجرا کردهایم و نام فایلهایی که اجرای این دستور بر روی آنها نتیجه موفقیت آمیز در پی داشته است را چاپ کرده ایم:
find . -type f -exec grep -l -i "hi" {} ;
دستور grep -l -i “hi” filename
محتویات فایل را بررسی میکند و چنانچه عبارت hi را در فایل پیدا کند نام فایل را در خروجی چاپ میکند. به این ترتیب با استفاده از دستور بالا محتویات فایلها را میتوانیم بررسی کنیم. دقت کنید که پیش از کاراکتر ; باید از کاراکتر استفاده کنیم تا دستور به صورت صحیح کار کند.
جستسجو بر اساس حجم فایلها
در مثال زیر به کمک دستور find میتوانید نام تمام فایلها با حجم بیشتر از ۳۰ مگابایت را در خروجی چاپ کنید:
find . -type f -size +30M
به همین صورت به کمک دستور زیر نام فایلهایی با حجم کمتر از ۱۰ کیلوبایت که دقیقا در دایرکتوری فعال کنونی قرار دارند را در خروجی چاپ میکنیم:
find . -maxdepth 1 -type f -size -20b
با دو مرتبه استفاده کردن از آزمون -size
میتوانیم فایلهایی که حجم آنها در یک بازه مشخص باشد را انتخاب کنیم. مثلا در این دستور فایلهایی با حجم بین ۲۰۰ کیلوبایت تا ۲ مگابایت را جستجو کردهایم:
find . -size +200k -size -2M
جستجوی فایلها و دایرکتوریهای خالی
با استفاده از آزمون -empty
میتوانید فایلهای خالی را انتخاب کنید. این آزمون را میتوانید برای انواع فایل به کار بگیرید. به طور مثال با استفاده از دستور زیر میتوانید دایرکتوریهای خالی را جستجو کنید:
find . -type d -empty
به همین صورت با ترکیب این آزمون و عملگر not میتوانیم هر فایل یا دایرکتوری که خالی نباشد را انتخاب کنیم. هر دو دستور زیر دایرکتوریهایی که خالی نیستند را جستجو میکنند:
find . -type d ! -empty find . type d -not -empty
جستجوی فایلها بر اساس پارامترهای زمانی
دستور زیر فایلهایی با پسوند txt که از آخرین ویرایش آنها بیش از ۸ روز گذشته باشد را جستجو میکند:
find /path/ -type f -name '*.txt' -mtime +8
همچنین اگر بخواهید فایلهایی که طی ۳ روز گذشته ویرایش شدهاند را جستجو کنید میتوانید از دستور زیر استفاده کنید:
find . -mtime -3 -type f
به همین صورت میتوانید دایرکتوریهایی که دقیقا ۲ روز پیش برای آخرین بار محتویات آنها تغییر کرده است را جستجو کنید:
find . -type d -mtime 2
به کمک دستور زیر میتوانیم فایلهایی با پسوند txt که بین ۲ تا ۱۰ دقیقه گذشته برای آخرین بار مورد دسترسی قرار گرفتهاند را جستجو کنیم:
find . -name "*.txt" -amin -10 -amin +2
جستجوی فایلها بر اساس مجوزهای دسترسی
آزمون -perm
برای بررسی مجوزهای دسترسی فایلها و دایرکتوریها به کار گرفته میشود. به طور مثال هر دو دستور زیر فایلهایی را جستجو میکنند که مالک فایل و گروه مالک فایل مجوزهای خواندن و نوشتن فایل را داشته باشند و سایر کاربران مجوز خواندن آنها را داشته باشند ولی هیچ کاربری مجوز اجرای فایلها را نداشته باشد:
find . -perm u=r+w,g=r+w,o=r find . -perm 664
دستور زیر فایلهایی که حداقل همه مجوزهای دسترسی فوق را داشته باشند را جستجو میکند. به این معنی که این فایلها ممکن است مجوز دسترسی اجرای فایل توسط مالک فایل، گروه مالک فایل یا سایر کاربران را داشته باشند. همچنین ممکن است سایر کاربران مجوز نوشتن بر روی این فایلها را نیز داشته باشند:
find . -perm -u=r+w,g=r+w,o=r find . -perm -644
این شکل از دستور find بیشتر مورد استفاده قرار میگیرد چراکه شما معمولا میخواهید مطمئن شوید مجوز کافی برای انجام عملیات خاصی را دارید. همچنین با استفاده از دستور زیر میتوانید فایلهایی که گروه مالک فایل یا سایر کاربران اجازه نوشتن بر روی آنها را دارند جستجو کنید:
find . -perm /g=w,o=w find . -perm /022
همان طور که میبینید مشخصکردن مجوزهای دسترسی بدون پیشوند (مانند مثال اول) به معنی جستجو برای فایلهایی است که دقیقا مجوزهای دسترسی مشخص شده را داشته باشند. استفاده از پیشوند –
در مجوزهای دسترسی (مانند مثال دوم) به این معنی است که همه مجوزهای قید شده حتما در بین مجوزهای دسترسی فایل موجود باشند و در نهایت پیشوند /
به این معنا خواهد بود که حداقل یکی از مجوزهای دسترسی قید شده در مجوزهای دسترسی فایل موجود باشد.
جستجوی فایلهای متعلق به کاربر یا گروه خاص
با استفاده از دستور زیر میتوانیم فایلهایی با پسوند pdf که متعلق به کاربری با نام user1 باشند را جستجو کنیم:
find . -iname "*.pdf" -user user1
به همین صورت دستور زیر فایلهایی مشابه که متعلق به گروه کاربری g1 باشند را جستجو خواهد کرد:
find . -iname "*.pdf" -group g1
همچنین با استفاده از اقدام -ls
میتوانیم جزئیات بیشتری را درباره فایلهایی که جستجو کردهایم ببینیم. به عنوان مثال با استفاده از دستور زیر مشخصات فایلهایی با پسوند pdf و متعلق به کاربر user1 را در خروجی خواهیم دید:
find . -iname "*.pdf" -user user1 -ls
میتوانیم از دستور زیر برای تغییر مجوزهای دسترسی فایلهایی متعلق به کاربری به نام user1 استفاده کنیم. این دستور فایلهایی با پسوند pdf و متعلق به کاربر user1 را جستجو میکند و مجوز دسترسی نوشتن را از مجوزهای دسترسی این فایلها حذف خواهد کرد:
find . -iname "*.pdf" -user user1 -exec chmod -w {} ;
دستور بالا مثالی از پردازش فایلها با استفاده از دستور find در لینوکس است، به همین صورت میتوانید دستورهای دیگری را بر روی فایلهایی که با پارامترهای جستجو مطابقت داده میشوند اعمال کنیم.
اعمال تغییرات بر روی فایلها و دایرکتوریها به کمک دستور find در لینوکس
با استفاده از دستور زیر میتوانید تمام فایلها با پسوند txt و pdf که طی نیم ساعت اخیر ویرایش شدهاند را از دو مسیر ./documents
و ./articles
در مسیر ./backups
کپی کنید:
find ./articles ./documents -mmin -30 ( -name " *.pdf" -o -name "*.txt" ) -exec cp {} ./backups ;
از دستورهایی مشابه دستور بالا میتوانید برای خودکارسازی اسکریپتهای مربوط به تهیه نسخه پشتیبان استفاده کنید.
همچنین به کمک دستور زیر میتوانید تمام فایلها با پسوند mkv را به مسیر ./Movies
منتقل کنید:
find ./Downloads -name "*.mkv" -exec mv {} ./Movies ;
به کمک هرکدام از دستورهای زیر میتوانیم فایلهایی در مسیر ~/tmp/
که بیش از ۳۰ روز از آخرین دسترسی به آنها گذشته است را حذف کنیم:
find ~/tmp -atime +30 -type f -delete find ~/tmp -atime +30 -type f -exec rm {} ;
اگر بخواهیم دستور find پیش از حذف هرکدام از فایلها تایید کاربر را بگیرد از باید از دستور زیر استفاده کنیم:
find ~/tmp -atime +30 -type f -ok rm {} ;
جمعبندی
در این مطلب از مجله فرادرس خواندیم که دستور find در لینوکس چیست و چطور باید از آن استفاده کنیم. دیدیم که علاوه بر جستجوی فایلها و دایرکتوریها برای پردازش فایلها نیز میتوانیم از این دستور استفاده کنیم. با نشانههای -L
و -H
آشنا شدیم که به کمک آنها میتوانیم رفتار دستور find در قبال لینکهای نمادین را مشخص کنیم. و همچنین با پارامترهای مربوط به بهینهسازی دستور find آشنا شدیم. این پارامترها در صورتی که از دستور find برای جستجو در میان تعداد زیادی از فایلها و دایرکتوریها استفاده کنید و یا هنگامی که این دستور را به دفعات در اسکریپتهای شل مربوط به خودکارسازی فرآیندها استفاده میکنید میتوانند به شما کمک کنند تا عملیات جستجو را در زمان کمتر و با مصرف منابع سیستمی کمتری انجام دهید.
با استفاده از عملگرهای منطقی میتوانیم آزمونها و اقدامات مختلف را با یکدیگر ترکیب کنیم و عملیات پیچیدهتری را با استفاده از یک دستور find انجام دهیم. هنگام انجام این کار باید توجه کنیم که عملگرهای «و» و «یا» پس از این که نتیجه کل عبارت مشخص شود از بررسی سایر عبارتها صرفنظر میکنند. مثالهایی از کاربرد عملگرها در دستور find را با هم مرور کردیم. در نهایت برای مطالعه بیشتر و دقیقتر درمورد قابلیتهای دستور find در لینوکس میتوانید دستور man find
را در ترمینال لینوکس وارد کنید تا راهنمای استفاده از این دستور را مشاهده کنید. همچنین برای مطالعه جزئیتر میتوانید به کتابچه راهنمای ابزار GNU Findutils (+) مراجعه کنید.
source