banner
دستور سرچ در لینوکس: 10 روش برای استفاده از دستور find در لینوکس

دستور سرچ در لینوکس: 10 روش برای استفاده از دستور find در لینوکس

دستور find یکی از کاربردی‌ترین دستورات لینوکس است، به‌ویژه زمانی که با صدها یا هزاران فایل و پوشه در رایانه‌های امروزی سروکار دارید. همان‌طور که از نامش پیداست، find به شما در یافتن موارد مختلف کمک می‌کند؛ آن هم نه فقط بر اساس نام فایل.

0 21 شهریور 1405

چه در حال کار با رایانه شخصی خود باشید و چه در سرور مجازی لینوکسی خود بخواهید فایلی را پیدا کنید، در اینجا ۱۰ روش برای استفاده از دستور find جهت یافتن داده های مهم آورده شده است.دستور سرچ در لینوکس یکی از پر کاربردترین دستورات را بیشتر بشناسید.

۱. یافتن یک فایل خاص بر اساس نام

زمانی که نام فایلی را می‌دانید اما محل ذخیره آن را به خاطر نمی‌آورید، از دستور find برای جستجو در دایرکتوری خانگی (home directory) خود استفاده کنید. برای نادیده گرفتن خطاهای مربوط به دسترسی (permission errors)، از عبارت

2>/dev/null

استفاده کنید (یا برای داشتن تمام دسترسی‌ها، دستور را با sudo اجرا نمایید).

$ find / -name “Foo.txt” 2>/dev/null
/home/seth/Documents/Foo.txt

خرید سرور مجازی

۲. یافتن یک فایل بر اساس نام تقریبی

اگر نام دقیق فایل را به خاطر نمی‌آورید یا مطمئن نیستید که آیا از حروف بزرگ استفاده کرده‌اید یا خیر، می‌توانید جستجویی جزئی و بدون حساسیت به بزرگی و کوچکی حروف (case-insensitive) به این صورت انجام دهید:

$ find / -iname “*foo*txt” 2>/dev/null
/home/seth/Documents/Foo.txt
/home/seth/Documents/foo.txt
/home/seth/Documents/foobar.txt

۳.دستور سرچ در لینوکس: یافتن همه چیز

دستور ls -R محتویات یک دایرکتوری را به صورت بازگشتی (recursively) فهرست می‌کند؛ به این معنا که نه تنها مسیر یا هدف تعیین‌شده توسط شما را فهرست می‌کند، بلکه به درون تمام زیردایرکتوری‌های موجود در آن (و زیردایرکتوری‌های زیردایرکتوری‌ها و غیره) نیز وارد می‌شود. دستور find نیز با استفاده از گزینه -ls همین قابلیت را دارد:

$ find ~/Documents -ls
3554235 0 drwxr-xr-x […] 05:36 /home/seth/Documents/
3554224 0 -rw-rw-r– […] 05:36 /home/seth/Documents/Foo
3766411 0 -rw-rw-r– […] 05:36 /home/seth/Documents/Foo/foo.txt
3766416 0 -rw-rw-r– […] 05:36 /home/seth/Documents/Foo/foobar.txt

توجه داشته باشید که در این مورد از

2>/dev/null

 استفاده نمی‌کنم، زیرا تنها قصد دارم محتویات مسیری را در دایرکتوری خانگی خود فهرست کنم و بنابراین انتظار بروز خطاهای مربوط به دسترسی را ندارم.

۴. یافتن بر اساس محتوا

دستور find لزومی ندارد که تنها یک وظیفه خاص را انجام دهد. در واقع، یکی از گزینه‌های موجود در find به شما امکان می‌دهد تا روی نتایج به‌دست‌آمده از آن، دستور دیگری را اجرا کنید. این قابلیت به‌ویژه زمانی مفید است که بخواهید فایلی را نه بر اساس نام، بلکه بر اساس محتوای آن جستجو کنید، یا نیاز به جستجو بر اساس هر دو مورد داشته باشید.

$ find ~/Documents/ -name “*txt” -exec grep -Hi penguin {} \;
/home/seth/Documents/Foo.txt:I like penguins.
/home/seth/Documents/foo.txt:Penguins are fun.

۵. یافتن فایل‌ها بر اساس نوع

با استفاده از گزینه type- می‌توانید فایل‌ها، دایرکتوری‌ها، لینک‌های نمادین (symlinks)، پایپ‌های نام‌گذاری‌شده (named pipes)، سوکت‌ها و موارد دیگر را نمایش دهید.

$ find ~ -type f
/home/seth/.bash_logout
/home/seth/.bash_profile
/home/seth/.bashrc
/home/seth/.emacs
/home/seth/.local/share/keyrings/login.keyring
/home/seth/.local/share/keyrings/user.keystore
/home/seth/.local/share/gnome-shell/gnome-overrides-migrated
[…]

تا زمانی که از نسخه GNU دستور find استفاده می‌کنید، می‌توانید چندین نوع فایل را در نتایج جستجوی خود بگنجانید:

$ find ~ -type f,l -name “notebook*”
/home/seth/notebook.org
/home/seth/Documents/notebook-alias.org

۶. فهرست کردن فقط دایرکتوری‌ها

یکی از کاستی های دستور ls این است که نمی‌توانید نتایج آن را بر اساس نوع فایل فیلتر کنید؛ بنابراین اگر فقط فهرستی از دایرکتوری‌های موجود در یک مسیر را بخواهید، خروجی آن ممکن است شلوغ و نامنظم باشد. دستور find به همراه گزینه type d- انتخاب بهتری است:

$ find ~/Public -type d
find ~/Public/ -type d
/home/seth/Public/
/home/seth/Public/example.com
/home/seth/Public/example.com/www
/home/seth/Public/example.com/www/img
/home/seth/Public/example.com/www/font
/home/seth/Public/example.com/www/style

۷. محدود کردن نتایج فهرست

با وجود صدها فایل در دایرکتوری پیش‌فرض کاربر و هزاران فایل دیگر در خارج از آن، گاهی اوقات دستور find نتایجی بیش از آنچه مد نظر شماست، برمی‌گرداند. می‌توانید با استفاده از گزینه maxdepth- عمق جستجو را محدود کنید؛ پس از این گزینه، باید تعداد سطوح دایرکتوری‌هایی را که می‌خواهید پس از نقطه شروع در آن‌ها جستجو شود، مشخص کنید:

$ find ~/Public/ -maxdepth 1 -type d
/home/seth/Public/
/home/seth/Public/example.com

۸.دستور سرچ در لینوکس: یافتن فایل‌های خالی

گاهی اوقات شناسایی فایل‌های خالی برای مرتب‌سازی و پاکسازی سیستم مفید است:

$ find ~ -type f -empty
random.idea.txt

از نظر فنی، می‌توان از دستور find برای حذف فایل‌های خالی استفاده کرد، اما حذف خودکار (برنامه‌ریزی‌شده) فایل‌ها خطرناک است. برای مثال، اگر هنگام جستجو برای فایل‌های خالی فراموش کنید گزینه type f- را وارد کنید، دایرکتوری‌ها نیز در نتایج ظاهر می‌شوند. در این صورت، با افزودن پرچم (flag) حذف، ممکن است ساختارهای دایرکتوریِ احتمالاً مهمی را پاک کنید.

بسیار مهم است که ابتدا دستور find را به درستی تنظیم کنید و پیش از انجام عملیات حذف، نتایج را بررسی نمایید. به‌علاوه، قرار دادن نادرست پرچم حذف در دستور  find می‌تواند منجر به حذف نتایج پیش از اعمال فیلترهای لازم شود (به‌عبارت دیگر، اگر پرچم حذف را پیش از پرچم تعیین نوع فایل قرار دهید، ممکن است در دستوری که صرفاً برای حذف فایل‌ها در نظر گرفته شده، دایرکتوری‌ها را نیز حذف کنید).

در موارد نادری که قصد دارم فایل‌ها را با استفاده از  find حذف کنم، ترجیح می‌دهم از ابزارهایی مانند  xargs یا  Parallel به همراه دستوری برای انتقال فایل‌ها به سطل زباله (trash) استفاده کنم.

۹. یافتن فایل‌ها بر اساس قدمت (زمان تغییر)

گزینه  mtime- به شما امکان می‌دهد جستجو را محدود کنید به فایل های قدیمی‌تر از (و همچنین فایل‌های جدیدتر از) حاصل‌ضرب یک مقدار در ۲۴.

$ find /var/log -iname “*~” -o -iname “*log*” -mtime +30

علامت + پیش از عدد مربوط به  mtime- به معنای جمع کردن آن عدد با زمان نیست؛ بلکه یک شرط است که (در این مثال) با مقداری بزرگ‌تر از حاصل‌ضرب ۳۰ در ۲۴ مطابقت دارد. به عبارت دیگر، این نمونه کد فایل‌های لاگی را پیدا می‌کند که طی یک ماه یا بیشتر، تغییری نکرده‌اند. برای یافتن فایل‌های لاگی که در طول هفته گذشته تغییر کرده‌اند، می‌توانید از شرط  -mtime -7 استفاده کنید:

$ find /var/log -iname “*~” -o -iname “*log*” -mtime -7
/var/log/tallylog
/var/log/cups/error_log
/var/log/cups/access_log
/var/log/cups/page_log
/var/log/anaconda/anaconda.log
/var/log/anaconda/syslog
/var/log/anaconda/X.log
[…]

شما قبلاً با فلگ  -ls آشنا شده‌اید، بنابراین برای نمایش واضح‌تر اطلاعات، می‌توانید آن را با دستورات فوق ترکیب کنید:

$ find /var/log -iname “*~” -o -iname “*log*” -mtime -7 -ls
-rw——- 1 root root 0 Jun 9 18:20 /var/log/tallylog
-rw——- 1 root lp 332 Aug 11 15:05 /var/log/cups/error_log
-rw——- 1 root lp 332 Aug 11 15:05 /var/log/cups/access_log
-rw——- 1 root lp 332 Aug 11 15:05 /var/log/cups/page_log
-rw——- 1 root root 53733 Jun 9 18:24 /var/log/anaconda/anaconda.log
-rw——- 1 root root 835513 Jun 9 18:24 /var/log/anaconda/syslog
-rw——- 1 root root 21131 Jun 9 18:24 /var/log/anaconda/X.log
[…]

خرید سرور مجازی

۱۰. جستجو در یک مسیر (Path)

گاهی اوقات ساختار دایرکتوریِ منتهی به فایل مورد نظرتان را می‌دانید، اما نمی‌دانید این ساختار دایرکتوری در کجای سیستم قرار دارد. برای جستجو در یک رشته مسیر (path string)، می‌توانید از گزینه  -ipath استفاده کنید؛ این گزینه کاراکترهای نقطه و اسلش را نه به عنوان کاراکترهای عبارات باقاعده (regex)، بلکه به عنوان همان نقطه و اسلشِ معمولی در نظر می‌گیرد.

$ find / -type d -name ‘img’ -ipath “*public_html/example.com*” 2>/dev/null
/home/tux/Public/public_html/example.com/font

 

دستور find ابزاری حیاتی برای مدیران سیستم است. این دستور هنگام بررسی یا آشنایی با یک سیستم جدید، یافتن داده‌های جابه‌جا شده و عیب‌یابی مشکلات روزمره بسیار کارآمد است؛ هرچند در عین حال، ابزاری برای راحتی و سهولت کار نیز محسوب می‌شود.

برای استفاده از  find نیازی به دلیلی خاص یا پیچیده ندارید. استفاده از این دستور، جستجو برای موارد مختلف را بسیار آسان‌تر از گشت‌وجوی دستی در سیستم می‌کند. find ابزاری است که شاید کمتر مورد توجه قرار گرفته باشد، اما فوق‌العاده کاربردی است و لذت ناب کار با لینوکس در امور روزمره را به خوبی نشان می‌دهد. همین امروز استفاده از آن را آغاز کنید و دریابید که چه چیزی آن را تا این حد عالی و کارآمد می‌سازد.

نظر شما چیست؟
سهیل دهقانی
سهیل دهقانی

کارشناس سئو، طراح سایت وردپرسی و تولیدکننده محتوا؛ عاشق بهینه‌سازی سایت و خلق محتوای کاربردی 🍀

شبکه های اجتماعی
به جواب سوالت رسیدی؟

ثبت دیدگاه ها

100days
×