راهنمای دستور find به صورت کاربردی

منبع: تجارب نویسنده از دستور find

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

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

وظیفه‌ی این دستور جستجو‌ی یک فایل یا دایرکتوری در یک شاخه یا تمام زیر شاخه‌های آن است.

چند کاربرد جالب از ترکیب آپشن‌های دستور find با هم:

۱. بعضی اوقات کاربر با دستور chmod سطح دسترسی تمام فایل‌ها و دایرکتوری‌های داخل یک شاخه یا تعدادی از آنها را باز می‌کند و بعداً متوجه می‌شود که در وضعیت امنی قرار ندارد (قبلاً این مورد برای خودم پیش آمده). به طور مثال برای شاخه /var/www که محل قرارگیری صفحات سایت (با دامنه‌ي تنظیم شده در بایند) است دسترسی مناسب برای فایل‌ها 644 و برای دایرکتوری‌ها ۷۵۵ است. با کمک دستور find می‌توان به راحتی دسترسی تمام فایل‌های داخل یک پوشه و دایرکتوری‌ها را به صورت مجزا به حالت استانداردشان تغییر داد:

find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;

توضیحات:

find یعنی بگرد.

. یعنی اینجا و تمام زیر شاخه‌هایش را بگرد.

type f – یعنی فایل‌هایی که از نوع فایل هستند.

type d – یعنی فایل‌هایی که از نوع دایرکتوری هستند.

-exec یعنی دستوری که در ادامه آمده را در موردشان اجرا کن.

;\ می‌گوید دستور اجرایی (executable) به پایان رسیده.

Chmod سطح دسترسی را به عددی که در ادامه آمده تغییر می‌دهد.

{} خروجی دستور find را در جلوی دستور chmod می‌گذارد.

۲. یکی از موارد بسیار پر کاربرد این دستور برای زمانیست که می‌خواهید یک فایل را در تمام شاخه‌های یک دایرکتوری جستجو کنید طوری که در خروجی آدرس کامل شاخه‌ی آن را ببینید. این دستور را می‌توان با دستور قبلی تلفیق کرد و یک دستور خاص را برای تمام فایل‌هایی که نامی مشخص دارند اعمال کرد.

find . -name file_name -print

توضیحات دستور:

find یعنی بگرد.

. یعنی اینجا و تمام زیر شاخه‌هایش را بگرد.

به جای file_name نام فایل مورد نظرتان را وارد کنید.

-print یعنی فایل‌هایی که پیدا کردی را با آدرس شاخه‌یشان در خروجی چاپ کن

۳. علامت تعجب ! ابتدای هر دستوری قرار بگیرد عملی که آخرین بار با آن دستور انجام شده را مجدداً تکرار می‌کند. اما مهم‌ترین کاربرد ! برای دستور find است. زیر جستجو‌ی یک نام و … خاص و انجام یک عمل (ترکیب کاربرد یک و دو) کاری بسیار زمان‌بر است (به خصوص اگر تعداد و حجم فایل‌هایمان زیاد باشد) و با اینکار کامپیوتر از نتیجه‌ی جستجو و انجام آن عمل آگاه است و این یعنی صرفجویی در زمان. مثلاً آخرین بار تمام فایل‌هایی که فرمت جاوا دارند را پیدا کرده‌ام:

find . -name "*.java"

اجرا میکنید:

!find

توضیحات: دستور قبلی بدون هیچ وقفه‌ای اجرا می‌شود.

۴. این‌بار میخواهیم فایل‌هایی که در طول یک روز، ساعت یا دقیقه اخیر ویرایش شده‌اند را جستجو کنیم. آپشن -mtime برای جستجو‌ی فایل‌ها بر اساس زمان تغییرشان استفاده می‌شود. البته دستور find آپشن‌های مرتبط با زمان دیگری هم دارد از جمله -atime و -ctime یعنی حرف m در mtime- مخفف modification یا تغییر است.

find . -mtime 1

توضیحات: این دستور تمام فایل‌هایی که دقیقاً یک روز پیش ویرایش شده‌اند را پیدا می‌کند.

find . -mtime +1

توضیحات: این دستور تمام فایل‌هایی که بیش از یک روز از ویرایششان می‌گذرد را پیدا می‌کند.

find . -mtime -1

توضیحات: این دستور تمام فایل‌هایی که کمتر از یک روز از ویرایششان می‌گذرد را پیدا می‌کند.

۵. در کاربرد چهار فایل‌ها را بر اساس زمان پیدا می‌کردیم. این‌بار میخواهیم بر اساس سطح دسترسی فایل‌ها را پیدا کنیم. برای این منظور از آپشن -perm استفاده میکنیم. یکی از کاربرد های جالب این دستور در ترکیب با کاربرد ۱ است. یعنی می‌توان تمام فایل‌هایی که سطح دسترسی بخصوصی دارند را پیدا کرد و سطح دسترسی‌یشان را به مقدار مورد نظر تغییر داد:

find . -perm 644

توضیحات: این کامند تمام فایل‌هایی که سطح دسترسی ۶۴۴ دارند را پیدا می‌کند.

۶. دستور find مانند سایر دستور‌ها به حروف بزرگ و کوچک انگلیسی حساس است. (همان کیس سنستیو) برای جستجو‌ی نام فایل‌ها بدون توجه به بزرگ بودن یا کوچک بودن حروفشان از دستور زیر استفاده میکنیم:

find . –iname file-name –print

توضیحات:

حرف i از اول کلمه‌ي ignore آمده.

به جای file-name نام مورد نظرتان را قرار دهید.

توضیح بقیه قطعات این دستور در کاربرد ۲ آمده.

درود بر آقامون ریچارد استالمن!

یک آزادمرد واقعی…