دستور find یکی از کاربردیترین دستورات لینوکس است، بهویژه زمانی که با صدها یا هزاران فایل و پوشه در رایانههای امروزی سروکار دارید. همانطور که از نامش پیداست، find به شما در یافتن موارد مختلف کمک میکند؛ آن هم نه فقط بر اساس نام فایل.
چه در حال کار با رایانه شخصی خود باشید و چه در سرور مجازی لینوکسی خود بخواهید فایلی را پیدا کنید، در اینجا ۱۰ روش برای استفاده از دستور 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 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 ابزاری است که شاید کمتر مورد توجه قرار گرفته باشد، اما فوقالعاده کاربردی است و لذت ناب کار با لینوکس در امور روزمره را به خوبی نشان میدهد. همین امروز استفاده از آن را آغاز کنید و دریابید که چه چیزی آن را تا این حد عالی و کارآمد میسازد.