اگر نیاز به جستجوی یک یا چند فایل یا دایرکتوری خاص دارید، دستور Find از جمله دستورات لینوکس است که میتواند ابزار مناسبی برای این کار باشد. با استفاده از دستور Find میتوانید فایلی را با نام خاص جستجو کنید. همچنین شما میتوانید فایلهایی را که از الگوهای نامگذاری خاصی پیروی میکنند یا فایلها را بر اساس اندازه فایل، پسوند فایل یا بسیاری از گزینههای دیگر پیدا کنید.
دستور Find بسیار متنوع بوده و با گزینههای زیادی همراه است. یادگیری نحوه استفاده از آن ممکن است کمی طول بکشد، اما در نهایت، بسیار مفیدتر از جستجوی دستی یا از طریق رابط کاربری گرافیکی برای فایلها است. همچنین میتوانید دستور find را برای اجرای دستور دیگری بر روی هر فایلی که با معیارهای جستجوی خاصی مطابقت دارد، به کار ببرید. چه در حال جستجوی فایلی در دایرکتوری فعلی خود یا یکی از زیرشاخههای آن، یا در هر نقطهای از کل سیستم خود باشید، میتوانید از دستور find استفاده کنید.
در این مقاله آموزشی نحوه استفاده از دستور find در سرور لینوکس را از طریق مثالهایی را به شما آموزش خواهیم داد. پس برای اطلاع از نحوه عملکرد این دستور با ما همراه باشید و تا در کمترین زمان در آن متخصص شوید.
نحوه استفاده از دستور find در لینوکس
هنگامی که برای اولینبار به یک مثال دستور Find نگاه میکنید، ممکن است به نظر برسد که این دستور گیجکننده است. در واقع این دستور، گزینههای زیادی دارد و برخی از آنها میتوانند بسیار پیچیده باشند. اما نگران نباشید، ما در این مقاله سعی میکنیم تا تمام بخشهای پیچیده دستور Find را تجزیه کنیم.
گزینههای پرکاربرد
exec CMD-: فایل در حال جستجو که معیارهای فوق را برای اجرای موفقیتآمیز دستور برآورده میکند، 0 را بهعنوان وضعیت خروجی آن برمیگرداند.
ok CMD-: مانند -exec کار میکند، به جز اینکه ابتدا از کاربر در خواست میشود.
-inum N: فایلهایی با«inode number ‘N’» را جستجو کنید.
links N-: فایلهایی را با لینک «N» جستجو کنید.
name demo-: فایلهایی را جستجو کنید که توسط «demo» مشخص شدهاند.
newer file-: فایلهایی را جستجو کنید که بعد از «File» اصلاح یا ایجاد شدهاند.
perm octal-: در صورتی که مجوز «octal» باشد، فایل را جستجو کنید.
print-: نام مسیر فایلهای پیدا شده را با استفاده از بقیه معیارها نمایش میدهد.
empty-: فایلها و دایرکتوریهای خالی را جستجو کنید.
size +N/-N-: جستجوی فایلهای بلوک N. برای اندازهگیری اندازه در کاراکتر میتوان از «N» و به دنبال آن «c» استفاده کرد. «+N» به معنای اندازه > بلوکهای «N» و «-N» به معنای اندازه < بلوکهای «N» است.
user name-: فایلهای متعلق به نام کاربری یا شناسه «name» را جستجو کنید.
\(expr \): اگر «expr» درست باشد درست است. برای گروهبندی معیارهای ترکیبی با OR یا AND استفاده میشود.
expr!: اگر «expr» نادرست باشد درست است.
ساختار دستور Find در لینوکس
برای شروع، اجازه دهید ساختار اصلی دستور find را بررسی کنیم. دقت کنید ساختار دستور Find در اوبونتو و دیگر توزیعهای لینوکس یکسان است.
1 | find start_directory test options criteria_to_match |
1 | action_to_perform_on_results |
در دستور زیر find شروع به جستجو در دایرکتوری فعلی میکند که با علامت «.» نشاندادهشده است، برای هر فایلی که پسوند «java» در نام آن وجود دارد:
1 | find . -name "*.java" |
در اینجا فهرست مختصری از آنچه که پیدا کرده است آمده است:
1 2 3 4 | find . -name "*.java" ./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java ./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java ... |
اگرچه همه آرگومانهای دستور Find اختیاری هستند، اما اگر تعیین نکنید که جستجو از کجا شروع شود، جستجو به طور پیشفرض در فهرست راهنمای فعلی آغاز میشود. اگر یک شرط تست، یک گزینه یا مقداری را که باید مطابقت داده شود مشخص نکنید، نتایج شما ناقص خواهد بود.
اجرای سه دستور Find زیر، همگی نتایج یکسانی را به همراه خواهد داشت. فهرست کاملی از تمام فایلهای موجود در دایرکتوری فعلی و همه زیرشاخهها از جمله فایلهای مخفی را نشان میدهد:
1 | find |
1 | find . |
1 | find . -print |
این شبیه اجرای دستور ls با گزینههای -la است. اگر میخواهید خروجی دستورات بالا شامل نام مسیرهای کامل باشد، شاید برای یک نسخه پشتیبان، باید مسیر کامل را برای دایرکتوری شروع مشخص کنید:
1 2 3 4 | find /home/bluher -name \*.java /home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java /home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java/ ... |
شما همچنین میتوانید بیش از یک دایرکتوری شروع را در یک رشته جستجو تعیین کنید. اگر به عنوان یک کاربر با امتیازات مناسب اجرا شود، دستور زیر بر دایرکتوریهای usr/، /home و سپس tmp/ اجرا میشود تا تمام فایلهای jar را جستجو کند:
1 | find /usr /home /tmp -name "*.jar" |
با این حال، اگر مجوزهای مناسب را نداشته باشید، با شروع جستجوی بسیاری از دایرکتوریهای سیستم، پیامهای خطا ایجاد میشود. به مثال زیر توجه کنید:
1 | find: /tmp/orbit-root: Permission denied |
شما میتوانید با اضافه کردن رشته جستجوی خود به صورت زیر از خروجی بههمریخته جلوگیری کنید:
1 | find /usr /home /tmp -name "*.jar" 2>/dev/null |
از گزینه iname- به جای name- استفاده کنید تا دستور Find به حروف بزرگ و کوچک حساس نباشد.
1 2 3 | find downloads -iname "*.gif" downloads/.xvpics/Calendar05_enlarged.gif downloads/lcmgcfexsmall.GIF |
همچنین میتوانید فایلها را بر اساس روشهای به غیر از نام فایل جستجو کنید. بهعنوانمثال، با دستور زیر میتوانید تمام زیرشاخهها را در یک پوشه پیدا کنید:
1 | find . -type d |
همچنین با دستور زیر میتوانید تمام پیوندهای نمادین را در دایرکتوری usr/ خود پیدا کنید:
1 | find /usr -type l |
این احتمالاً فهرستی از بیش از 3000 پیوند را به همراه خواهد داشت. هر یک از دستورات زیر که با روت اجرا میشوند، لیستی از پیوندها در پوشه /usr و فایلی که به آن اشاره میکند را نشان میدهد:
1 2 3 4 5 | # find /usr/bin -type l -name "z*" -exec ls -l {} \; lrwxrwxrwx 1 root root 8 Dec 12 23:17 /usr/bin/zsh -> /bin/zsh lrwxrwxrwx 1 root root 5 Dec 12 23:17 /usr/bin/zless -> zmore lrwxrwxrwx 1 root root 9 Dec 12 23:17 /usr/bin/zcat -> /bin/zcat find /usr/bin -type l -name "z*" -ls |
با این حال، دستور دوم، یک لیست فایل طولانی با اطلاعات دایرکتوری و inode را نیز به همراه خواهد داشت. در ادامه این مقاله درباره استفاده از عملکردهای -exec و -ls بحث خواهیم کرد.
سایر انواع فایلهایی که میتوانند پیدا کنند عبارتاند از:
• b—block (بافر) ویژه
• c—character (بدون بافر) ویژه
• p—named pipe (FIFO)
• s—socket
استفاده از root به عنوان نقطه شروع برای دستور find میتواند سرعت سیستم شما را به میزان قابلتوجهی کاهش دهد. اگر واقعاً باید چنین دستوری را اجرا کنید، ممکن است آن را در مدت زمان کم استفاده یا یک شب اجرا کنید. شما میتوانید خروجی را با استفاده از دستور زیر به یک فایل تغییر مسیر دهید:
1 | find / -print > masterfilelist.out |
اگر متوجه شدید که به اشتباه دستور find را وارد کردهاید که خروجی ناخواسته زیادی تولید میکند، فقط با فشار دادن CTRL-C دستور را قطع کنید تا آخرین دستور اجرا شده را متوقف کند.
در شبکههای سازمانی با سیستمهای متعدد، محدود کردن فایلهایی که جستجو میکنند بسیار خوب است. از هر تعداد از گزینهها و آزمایشهای لازم برای کاهش بار روی سیستم خود استفاده کنید. دو مورد از مفیدترین گزینهها برای این منظور -xdev و -mount هستند. آنها جستجو را با جلوگیری از نزول یافتن به دایرکتوریها در سیستمهای فایل دیگر مانند MS-DOS، CD-ROM یا AFS محدود میکنند. این جستجو را به همان نوع سیستم فایلی که دایرکتوری شروع است محدود میکند.
اگر دستور mount اجرا شود، کاربرانی که در سیستم بوت دوگانه قرار دارند، می توانند با این گزینه ها بازی کنند. با فرض اینکه یک پارتیشن ویندوز درگیر است، میتوانید آن را با دستور زیر نصب کنید:
1 | mount -t vfat /dev/sda1 /mnt/msdos |
دستور واقعی که استفاده میکنید به نحوه تنظیم سیستم شما بستگی دارد. شما میتوانید با اجرای df یا با اجرای دستور زیر بررسی کنید که پارتیشن نصب شده است:
1 | find /mnt/msdos -name "*.txt" 2> /dev/null |
شما باید یک لیست طولانی از فایلهای پارتیشن MS Windows را ببینید. حالا دستور زیر را با گزینه -mount یا -xdev اجرا کنید:
1 | find / -name "*.txt" -mount 2> /dev/null |
or
1 | find / -name "*.txt" -xdev 2> /dev/null |
امکان دیگر این است که به صراحت بگوییم با استفاده از تست -fstype به کدام فایل سیستم نگاه کنید، مانند این مثال:
1 | find / -name "*.txt" -fstype vfat 2> /dev/null |
دستور Find برای جستجوی فایل بر اساس زمانبندی
دستور find در اوبونتو و دیگر توزیعهای لینوکس چندین گزینه دارد که برای جستجوی فایلها بر اساس زمانبندی سیستم شما استفاده میشود. این تمبرهای زمانی شامل:
· mtime – زمانی که محتوای یک فایل آخرین بار تغییر کرده است.
· atime- زمانی که یک فایل خوانده شده یا به آن دسترسی داشته است.
· ctime – زمانی که وضعیت یک فایل تغییر کرده است.
در حالی که معنای mtime و atime کاملاً روشن است، ctime به توضیح بیشتری نیاز دارد. از آنجایی که inode متادیتا را روی هر فایل نگهداری میکند، در صورت تغییر ابرداده مربوط به فایل، دادههای inode تغییر میکنند. این میتواند به دلیل طیف وسیعی از اقدامات، از جمله ایجاد یک پیوند نمادین به فایل، تغییر مجوزها در یک فایل، یا انتقال فایل ایجاد شود. از آنجایی که محتوای فایل در این موارد خوانده یا اصلاح نمیشود، mtime و atime تغییر نمیکنند، اما ctime تغییر میکند.
هر یک از این گزینههای زمانی باید با مقدار n استفاده شود که به صورت -N، +N یا N مشخص میشود.
· -N کمتر از N برمیگرداند.
· +N بزرگتر از N برمیگرداند.
· N به خودی خود دقیقاً N منطبق را برمیگرداند.
برای روشنتر شدن این موضوع، به چند مثال نگاه میکنیم. دستور زیر تمام فایلهای اصلاح شده در یک ساعت گذشته را پیدا میکند:
1 2 3 4 | find . -mtime -1 ./plsql/FORALLSample ./plsql/RegExpDNASample /plsql/RegExpSample |
با اجرای همین دستور با 1 به جای +1، تمام فایلهایی که دقیقاً یک ساعت پیش اصلاح شدهاند را پیدا میکند:
1 | find . -mtime 1 |
گاهی ممکن است دستور بالا هیچ نتیجهای نداشته باشد، زیرا باید دقیقتر باشد. دستور زیر به دنبال فایلهایی میگردد که بیش از یک ساعت پیش اصلاح شدهاند:
1 | find . -mtime +1 |
به طور پیشفرض، -mtime، -atime و -ctime به 24 ساعت گذشته اشاره دارد. با این حال، اگر قبل از آنها گزینه Daystart وجود داشته باشد، دوره 24 ساعته با شروع روز آغاز میشود. همچنین میتوانید با استفاده از mmin، amin و cmin به دنبال مهرهای زمانی بگردید که در کمتر از یک ساعت تغییر کردهاند.
اگر بلافاصله پس از ورود به حساب کاربری خود، موارد زیر را اجرا کنید، تمام فایل هایی که کمتر از 1 دقیقه قبل خوانده شده اند را خواهید دید:
1 2 3 4 | find . -amin -1 ./.bashrc /.bash_history ./.xauthj5FCx1 |
لازم به ذکر است که مکانیابی یک فایل با دستور find، زمان دسترسی آن فایل را به عنوان بخشی از ابر داده آن تغییر میدهد.
همچنین میتوانید فایلهایی را که در مقایسه با یک فایل خاص تغییریافته یا به آنها دسترسی پیدا کردهاند، با گزینههای -newer، -anewer و -cnewer پیدا کنید. این شبیه -mtime، -atime و -ctime است.
· -newer به فایلهایی اطلاق میشود که محتوای آنها اخیراً تغییر یافته است.
· -anewer به فایلهایی اطلاق میشود که اخیراً خوانده شدهاند.
· -cnewer به فایلهایی اشاره دارد که وضعیت آنها اخیراً تغییر کرده است.
برای پیدا کردن تمام فایلهای موجود در فهرست اصلی خود که از زمان آخرین فایل tar به نحوی ویرایش شدهاند، از این دستور استفاده کنید:
1 | find . -newer backup.tar.gz |
استفاده از دستور Find برای جستجوی فایلها بر اساس اندازه
گزینه size- فایلهایی را پیدا میکند که معیارهای اندازه مشخص شده را برآورده میکنند. برای پیدا کردن تمام فایلهای کاربری بزرگتر از 5 مگابایت، از دستور زیر استفاده کنید:
1 2 3 4 | find / -size +5000000c 2> /dev/null /var/log/lastlog /var/log/cups/access_log.4 /var/spool/mail/bluher |
«c» در انتها نتایج ما را بر حسب بایت گزارش میدهد. به طور پیشفرض، اندازه گزارشها را به تعداد بلوکهای 512 بایتی پیدا کنید. همچنین اگر «c» را با «k» جایگزین کنیم، یا اگر از «w» استفاده کنیم، میتوانیم نتایج را به صورت تعداد کیلوبایت ببینیم.
از گزینه -size اغلب برای جستجوی همه فایلهای صفر بایت و انتقال آنها به پوشه /tmp/zerobyte استفاده میشود. دستور زیر دقیقاً این کار را انجام میدهد:
1 | find test -type f -size 0 -exec mv {} /tmp/zerobyte \; |
عمل -exec به find اجازه میدهد تا هر دستوری را روی فایلهایی که با آن مواجه میشود انجام دهد. براکتها امکان جابهجایی هر یک از فایلهای خالی را فراهم میکنند.
از گزینه -empty نیز میتوان برای یافتن فایلهای خالی استفاده کرد:
1 2 3 | find test -empty test/foo test/test |
کنترل دستور Find در لینوکس
بر خلاف بسیاری از دستورات در لینوکس، find به گزینه -r یا -R برای دسترسی به زیر شاخهها نیازی ندارد. بلکه این کار را به صورت پیش فرض انجام میدهد. با این حال، ممکن است بخواهید گاهی اوقات این رفتار را محدود کنید. به همین دلیل، گزینههای -depth، -maxdepth، و -mindepth و -action -prune ممکن است مفید باشند.
گزینههای -maxdepth و -mindepth به شما این امکان را میدهند که تعیین کنید تا چه اندازه در دایرکتوری میخواهید جستجو کنید. اگر میخواهید فقط یک سطح از دایرکتوری جستجو کنید، از گزینه maxdepth استفاده کنید.
با اجرای دستور زیر میتوانید اثرات -maxdepth را مشاهده کنید تا به دنبال فایلهای گزارش در سه سطح بالای درخت دایرکتوری بگردید. این خروجی به طور قابلتوجهی کمتر از زمانی که بدون آن اجرا میشود تولید میکند.
1 2 3 4 5 6 7 8 9 | find -name "*test*" -depth ./test/test ./test ./localbin/test ./localbin/test_shell_var ./localbin/test.txt ./test2/test/test ./test2/test ./test2 |
مثالهای مختلف برای دستور Find در لینوکس
مثال 1: بیایید با سادهترین نحو ممکن شروع کنیم، یعنی جستجوی یک فایل با نام آن در دایرکتوری کاری فعلی. برای انجام این کار با استفاده از دستور Find، دایرکتوری و نام فایل را با گزینه -name مشخص کنید.
1 | $ find . -name "example.txt" |
در اینجا باید به چند نکته توجه کنید: این دستور نه تنها دایرکتوری فعلی را جستجو میکند، بلکه همه زیرشاخههای آن را نیز جستجو میکند (حتی اگر ساختار بسیار عمیق باشد). علاوه بر این، با هر فایل یا دایرکتوری که نامی را که ما مشخص کردهایم، مطابقت دارد.
مثال 2: در مرحله بعد، بیایید سعی کنیم یک دایرکتوری دیگر را برای یک نوع خاص از فایل جستجو کنیم. در این مثال، ما در فهرست /home (و زیرشاخههای آن) برای هر نام فایلی که به png. ختم میشود، جستجو میکنیم.
1 | $ find /home -name "*.png" |
مثال 3: میتوانید از گزینه -type برای دستور find فقط برای جستجوی فایلها یا دایرکتوریها استفاده کنید. اگر این گزینه را مشخص نکنید، این دستور نتایج را برای هر دو برمیگرداند. برای اینکه فقط فایلها را جستجو کنید، باید از دستور زیر استفاده کنید:
1 | $ find /home -type f -name "example" |
اگر میخواهید فقط دایرکتوریها را جستجو کنید، دستور زیر را به کار ببرید:
1 | $ find /home -type d -name "example" |
مثال 4: از گزینه iname- به جای name- استفاده کنید تا به حروف بزرگ و کوچک جستجوی شما حساس نباشد.
1 | $ find /home -type f -iname "example.txt" |
مثال 5: اگر نمیخواهید دستور find در لینوکس اوبونتو بیش از حد عمیق در زیر شاخهها حرکت کند، میتوانید با گزینه maxdepth- حدی را مشخص کنید. برای مثال، این دستور find را به عمق دو شاخه فرعی محدود میکند:
1 | $ find . -type f -maxdepth 2 -name "example.txt" |
مثال 6: اکنون که شروع به درک نحوه عملکرد دستور find و گزینههای آن کردهاید، اجازه دهید چند مورد جدید را در دستور بعدی ترکیب کنیم. مثال زیر تمام فایلهای .conf را که در هفت روز گذشته اصلاح شدهاند، متعلق به کاربر linuxconfig هستند و در فهرست اصلی آن کاربر وجود دارند، نشان میدهد.
1 | $ find /home/linuxconfig -type f -user linuxconfig -mtime -7 -name "*.conf" |
مثال 7: اگر گزینه delete- را مشخص کنید، دستور find میتواند به طور خودکار فایلهایی را که پیدا میکند حذف کند. در مورد این گزینه بسیار مراقب باشید و حتماً ابتدا دستور find را بدون آن اجرا کنید تا دقیقاً بدانید که قصد دارید چه چیزی را حذف کند.
1 | $ find . -type f -name "*.tmp" -delete |
استفاده پیشرفته از دستور Find در لینوکس
پیشرفتهترین استفاده از دستور find شامل استفاده از آن برای اجرای دستورات دیگر بر روی پروندههایی است که با معیارهای جستجوی خاصی مطابقت دارند.
مثال 1: عملکرد دستور find را میتوان با گزینه -exec بیشتر گسترش داد. استفاده از این گزینه به شما این امکان را میدهد که روی هر فایلی که پیدا میکند، یک دستور را اجرا کنید. بهعنوانمثال، اجازه دهید مجوزهای فایل را برای هر فایل یافت شده به ۷۵۰ تغییر دهیم:
1 | $ find . -type f -name "*.conf" -exec chmod 750 '{}' \; -print |
در دستور بالا، «{}» یک مکان نگهدار برای فایلهایی است که با find پیدا میشوند. گزینه -exec با یک نقطه ویرگول خاتمه مییابد که باید از آن خارج شود، از این رو گزینه ‘ \; -print تمام نام فایلها و مسیرهای خروجی را به ترمینال شما ارسال میکند.
مثال 2: بسته به دستوری که در داخل پارامترهای -exec اجرا میکنید، گاهی اوقات استفاده از علامت مثبت به جای نقطه ویرگول کارآمدتر است. انجام این کار به find اجازه میدهد تا دستور را روی چندین فایل به طور همزمان اجرا کند. این برخلاف مثال قبلی است که در آن تنها یک فایل مجوزهای آن را در یک زمان تغییر میداد.
1 | $ find . -type f -name "*.conf" -exec chmod 750 '{}' + -print |
در این مثال خاص، شما واقعاً افزایش سرعت زیادی را مشاهده خواهید کرد. اما بسته به دستوری که اجرا میکنید، نتایج شما میتواند متفاوت باشد. بهتر است هر دو روش را آزمایش کنید.
جمعبندی
دستور Find Linux به طور همزمان یکی از مفیدترین و مخدوشکنندهترین دستورات لینوکس به شمار میرود. این دستور کمی سخت و پیچیده است؛ زیرا نحو آن با نحو استاندارد سایر دستورات لینوکس متفاوت است. دستور find در جستجوی فایلها و دایرکتوریها بسیار قدرتمند است، زیرا تعداد زیادی از گزینهها در دستور قرار میگیرند و به شما امکان میدهد فایلها را بر اساس نام فایل، نوع فایل، بر اساس زمان و حجم پیدا کنید. با دستور find، نه تنها میتوانید فایلها را با هر ترکیبی از این ویژگیها مکانیابی کنید، بلکه میتوانید روی فایلهایی که پیدا میکند نیز اقداماتی را انجام دهید.
در این مقاله آموزشی به آموزش و نحوه استفاده از دستور find در لینوکس پرداختیم و با مثالهای کاربردی متعدد سعی کردیم شما را به صورت کامل با این دستور آشنا کنیم. امیدواریم که این آموزش نیز مورد توجه شما قرار گرفته باشد. شما میتوانید نظرات و سوالات خود را از طریق کامنتها با ما به اشتراک بگذارید.
سؤالات متداول
1- دستور find در لینوکس چیست؟
از گزینه -perm برای پیدا کردن فایلها با مجوز استفاده میشود. دستور find را با گزینه -perm اجرا کنید و مقدار مورد نیاز را ارسال کنید. دستور زیر را در نظر بگیرید: find./<directory name> -perm 777.
2- چگونه یک فایل را در لینوکس پیدا کنیم؟
- find . – name thisfile.txt: پیدا کردن فایلی به نام thisfile در لینوکس.
- find /home -name *.jpg: پیدا کردن فایلهای jpg در /home و دایرکتوریهای زیر آن.
- find . – type f -empty: پیدا کردن فایلهای خالی در دایرکتوری.
3- چگونه از دستور Find در لینوکس استفاده کنیم؟
- / (slash): کل سیستم را جستجو کنید.
- . (dot): در پوشهای که در حال حاضر روی آن کار میکنید جستجو کنید (دایرکتوری فعلی).
- ~ (tilde): پوشه اصلی را جستجو کنید.