جستجو در میان فایل ها در لینوکس – دستور Find
دستور Find که برای جستجو و پیدا کردن فایل در سیستم عامل linux مورد استفاده قرار می گیرد.
شما می توانید فایل های مورد نیاز را بر اساس date ,permission ,type ,group ,owner ,name و دیگر معیارها پیدا کند.
اگر دستور find را بدون هیچ آرگومان و گزینه ای وارد کنید، لیست تمام فایلهای موجود در شاخه جاری و زیر شاخههای آن را چاپ میکند.
سنتکس کلی دستور Find به شکل زیر میباشد :
find [-H] [-L] [-P] [path...] [expression]
پیدا کردن یک فایل با نام آن و بدون در نظر گرفتن کوچکی و بزرگی حروف
find / -iname "host.conf"
پیدا کردن یک فایل با نام فایل
find / -name "host.conf"
دستور زیر ۵ تا از بزرگترین فایل های موجود در دایرکتوری و زیر دایرکتوری جاری را لیست میکند . با توجه به اندازه فایل مورد نیاز این جستجو ممکن است کمی زمانبر باشد.
find . -type f -exec ls -s {} \; | sort -n -r | head -5
یافتن ۵ تا از کوچکترین فایل ها در دایرکتوری جاری
find . -type f -exec ls -s {} \; | sort -n | head -5
فهرستی از فایل های تهی موجود در دایرکتوری جاری را نشان میدهد
find . -maxdepth 1 -empty
یافتن فایل passwd در دایرکتوری روت فقط تا یک سطح بعد از دایرکتوری روت
find / -maxdepth 2 -name passwd
یافتن فایل passwd در دایرکتوری روت تا حداکثر دو سطح بعد از دایرکتوری جاری
find -mindepth 3 -maxdepth 5 -name passwd
یافتن فایل passwd بین زیر دایرکتوری جاری دوم و چهارم
find -mindepth 3 -maxdepth 5 -name passwd
پیدا کردن همه ی فایل های با پسوند txt و کپی آنها از یک دایرکتوری به دایرکتوری دیگر
find /home/user1 -name ‘*.txt’ | xargs cp -av –target-directory=/home/backup/ –parents
نمایش همه ی فایل ها داخل پارتیشن لینوکس ( / ) که دارای مجوز مورد نظر هستند
find / -perm -u+s
جستجوی فایل های با پسوند rpm و تغییر مجوز آنها !
find / -name *.rpm -exec chmod 755 ‘{}’ \;
جستجوی فایل های ایجاد شده با تغییر کرده در طول ۱۰ روز گذشته
find /usr/bin -type f -mtime -10
جستجوی فایل های باینری که در ۱۰۰ روز گذشته استفاده نشده اند
find /usr/bin -type f -atime +100
جستجوی فایل و دایرکتوری متعلق به user1
find / -user user1
نمایش مکان یک فایل باینری , سورس یا مستندات
whereis halt
پیدا کردن فایلهایی که بیشتر از ۱۰۰ کیلو بایت و کمتر از یک مگابایت حجم دارند
find . -size +100k -and -size -1M
دستور find اجازه استفاده از عملگر های -and -not و -or را به ما میدهد. عملگر -not نتیجه را برعکس میکند.
find -maxdepth 1 -not -iname "MyCProgram.c"
دستور بالا با عمق یک دایرکتوری تمام فایلهایی را که نام آنها Myprogram.c (غیر حساس به حروف کوچک و بزرگ) نیست را پیدا کرده و چاپ میکند.
میتوانید به جای -not از ! هم استفاده کنید. در این صورت باید قبل از ! یک بک اسلش (\) قرار دهید تا shell (پوسته)این علامت را به اشتباه تفسیر نکند. دستور زیر مشابه دستور بالاست.
find -maxdepth 1 \! -iname "MyCProgram.c"
دستور زیر دایرکتوری جاری و تمام زیر دایرکتوری هایش را جستجو میکند و فایلهایی را نشان میدهد که محتویات آنها در ۶۰ دقیقه اخیر تغییر کرده است
find . -mmin -60
دستور زیر دایرکتوری ریشه یعنی / را جستجو میکند و فایلهایی را که محتویات آنها در ۲۴ ساعت گذشته یا یک روز پیش تغییر کرده است را نشان میدهد.
find / -mtime -1
دستور زیر تمام فایل هایی که در بازه زمانی مشخص شده در پوشه جاری تغییر یافته و یا ایجاد شده اند را نمایش خواهد داد
find . -type f -newermt 2016-06-19 ! -newermt 2016-06-28
دستور زیر تمام فایل هایی که در بازه زمانی مشخص شده در پوشه جاری مشاهده شده اند را نمایش خواهد داد
find . -type f -newerat 2016-06-19 ! -newerat 2016-06-28
دستور زیر تمام فایل هایی که در بازه زمانی مشخص شده سطح دسترسی آنها تغییر یافته است (permission) را نمایش خواهد داد
find . -type f -newerct 2016-06-19 ! -newerct 2016-06-28
پیدا کردن فایلی از طریق مقایسه آن با Modification time فایلی دیگر فرض کنید که یک ساعت پیش فایل MybashProgram.sh را ویرایش کردید. حالا میخواهید تمام فایلهایی که از آن موقع تا کنون تغییر کردهاند را ببینید. گزینه -newer این کار را انجام میدهد و فایلهایی را که Modification time آنها از یک فایل خاص جدیدتر است را نمایش میدهد. مسیر کامل این فایل خاص را باید بعد از -newer وارد کنید.
find -newer MybashProgram.sh
دستور زیر فایلهایی که بعد از ویرایش فایل /etc/hosts در دسترس قرار گرفتهاند را نشان میدهد. اگر شما به خاطر می آورید که چیزی را به فایل /etc/hosts اضافه کردید و میخواهید فهرست تمام فایلهایی را ببینید که بعد از آن در دسترس قرار گرفتهاند این دستور را بزنید.
find -anewer /etc/hosts
دستور زیر تمام فایلهایی را نشان میدهد که inode آنها پس از ویرایش محتویات فایل /etc/fstab ، تغییر کرده . اگر شما یادتان میآید که یک mount point به فایل /etc/fstab اضلفه کردهاید و میخواهید تمام فایلهایی را که پس از آن واقعه ، اطلاعات inode شان تغییر کرده را ببینید این دستور را بزنید:
find -cnewer /etc/fstab
میتوان با گزینه -exec هر دستور دلخواهی را بر روی فایلهایی که دستور find پیدا کرده است، اجرا کنیم. عملیاتی که شما میتوانید بر روی فایلهای پیدا شده انجام دهید میتوانند اینها باشند:
* دستور rm برای پاک کردن
* دستور cp برای کپی کردن
* دستور mv برای تغییر نام یا جابه جایی
* دستور md5sum برای محاسبه الگوریتم md5sum
* دستور wc برای شمارش فایلها
* اجرای هر دستور دلخواه دیگر
* اجرای شل اسکریپتی که خودتان نوشتهاید.
سینتکس کلی به شکل زیر میباشد :
find <PATH> <CONDITION to Find files> -exec <OPERATION> {} \;
میخواهیم فایلهایی که myprogram.c نام دارند را پیدا کرده و سپس آنها را در پوشهhome/$USERNAME/backup کپی کنیم. برای کپی فایلها باید از دستور cp استفاده کنیم. سینتکس دستور cp بدین صورت است.
find -iname "MyCProgram.c" -exec /bin/cp {} /home/$USERNAME/bakup \;
اگر میخواهید فایلهای پیدا شده را پاک کنید میتوانید از دستور زیر استفاده کنید
find . -name mycprogram -delete
نکته مهم: اجرای اشتباه این دستور باعث حذف بدون بازکشت فایل های سرور شما خواهد شد.
اگر میخواهید فایلهایی که متعلق به گروه خاصی هستند را پیدا کنید، میتوانید با گزینه -group آن را مشخص کنید.
find -group root
تعداد لینک
این امکان وجود دارد که جستجو را بر اساس تعداد لینکهای سخت یک فایل انجام دهید. همانطور که توضیح داده شد هر inode میتواند چند نام داشته باشد که به این نامها لینک سخت میگویند و تا زمانیکه تعداد لینکهای سخت یک فایل به صفر نرسد فایل به صورت فیزیکی بر روی دیسک باقی می ماندو پاک نمیشود.
با گزینه -links میتوانید جستجو را بر اساس تعداد لینکهای سخت انجام دهید مثلاً دستور زیر تمام فایلهایی را که بیشتر از ۳ لینک سخت دارندو از نوع f هستند پیدا میکند.
find -type f -links +3
برای ذخیره نتیجه جستجو در یک فایل متنی میتوانید از دستور زیر استفاده نمایید:
find -fls list
دستور بالا خروجی را در فایلی به نام list ذخیره میکند. اگر این فایل وجود نداشته باشد ساخته میشود و اگر وجود داشته باشد بر روی آن overwrite میشود.