جستجو با استفاده از دستور Find _ بخش اول
از دستور find برای جستجوی فایل ها و دایرکتوری ها در لینوکس استفاده می شود.
شکل کلی دستور :
find [Path] [Expression] [Action]
این دستور دارای سوئیچ های متنوعی می باشد. در این نوشتار به بررسی این سوئیچ ها می پردازیم. در ابتدا با دستورات زیر محیط تست را می سازیم.
mkdir sample #
cd sample #
mkdir dir_test_1 dir_test_2 dir_test_3 #
touch dir_test_1/file_test_1 dir_test_2/file_test_2 dir_test_3/file_test_3 #
معرفی سوئیچ های پرکاربرد دستور find :
استفاده از دستور find به تنهایی، سبب نمایش لیستی شامل آدرس محتویات مکان فعلی و زیر مجموعه آن می گردد.
# find
.
./dir_test_2
./dir_test_2/file_test_2
./dir_test_3
./dir_test_3/file_test_3
./dir_test_1
./dir_test_1/file_test_1
سوئیچ name- :
برای جستجو بر اساس نام از این سوئیچ استفاده می شود.
# find -name 'file_test_2'
/root/sample/dir_test_2/file_test_2
I با دستور بالا عمل جستجو در مکان فعلی و زیرمجموعه ی آن انجام می شود. جهت جستجو در مکانی خاص، آدرس آن مکان به دستور اضافه می شود.
مثال : جستجوی فایل file_test_2 که در مسیر root/sample/ قرار دارد :
# find /root/sample -name 'file_test_2'
/root/sample/dir_test_2/file_test_2
I دستور بالا در صورتی با خروجی همراه می شود که عبارت مورد نظر کاملا مطابق با نام فایل یا دایرکتوری باشد. در نتیجه دستور پایین بدون خروجی می باشد :
# find /root/sample -name 'file_test'
برای سهولت در انجام جستجو می توان از کارکترهای خاص (Wildcard) نیز بهره برد.
· * = یک یا چند کاراکتر
· ؟ = یک کاراکتر
· [] = کاراکترهای میان براکت
مثال : جستجوی فایل هایی که در مسیر root/sample/ بوده و در نامشان عبارت test وجود دارد :
# find /root/sample -name '*test*'
/root/sample/dir_test_2
/root/sample/dir_test_2/file_test_2
/root/sample/dir_test_3
/root/sample/dir_test_3/file_test_3
/root/sample/dir_test_1
/root/sample/dir_test_1/file_test_1
مثال : جستجوی فایل هایی که در مسیر etc/ بوده و به عبارت conf. ختم می شوند(جستجوی فایل های تنظیمات) :
# find /etc -name '*.conf'
/etc/ld.so.conf.d/mysql-x86_64.conf
/etc/ld.so.conf.d/kernelcap-2.6.9-89.0.0.0.1.EL.conf
/etc/ld.so.conf.d/sblim-cmpi-syslog-x86_64.conf
/etc/ld.so.conf.d/xorg-x11-x86_64.conf
/etc/ld.so.conf.d/sblim-cmpi-nfsv3-x86_64.conf
/etc/ld.so.conf.d/sblim-cmpi-nfsv4-x86_64.conf
/etc/ld.so.conf.d/qt-i386.conf
….
I در لینوکس وجود پسوند در نام فایل ها صرفا برای شناخت بهتر کاربر می باشد.
مثال : جستجوی فایل هایی که نام آن ها با کاراکتر f شروع و به عدد 1 ختم می شود :
# find /root/sample -name 'f*1'
/root/sample/dir_test_1/file_test_1
مثال : جستجوی فایل های مسیر etc/ که نام آن ها دارای 6 کاراکتر بوده و با m شروع و به f ختم می شود :
# find /etc -name 'm????f'
/etc/my.cnf
I در لینوکس هر فایل و یا دایرکتوری که نام آن با نقطه آغاز شود، بعنوان فایل و یا دایرکتوری مخفی می باشد.
مثال : جستجوی فایل و دایرکتوری مخفی سیستم به صورت زیر قابل انجام می باشد :
# find / -name '.*'
جستجو در چند مسیر :
برای انجام جستجو در دو یا چند مسیر، کافیست مسیرها پشت سر هم در دستور درج شود.
مثال : جستجو فایلی با نام bashrc در مسیرهای root , /etc , /boot/ بصورت زیر است :
# find /root /etc /boot -name 'bashrc'
/etc/bashrc
سوئیچ ls- :
در صورت استفاده از این سوئیچ جزئیات بیشتری از فایل هایی که در نتیجه ی جستجو بدست آمده اند نمایش می یابد.
# find /root /etc /boot -name 'bashrc' -ls
5111829 4 -rw-r--r-- 1 root root 2681 Oct 2 2013 /etc/bashrc
سوئیچ or- یا o- :
این سوئیچ نقش عملگر OR را ایفا می کند. بدین معنی که خروجی هر قسمت، نمایش داده می شود. (در خروجی مقدار تکراری وجود ندارد)
مثال : جستجوی فایل هایی که نامشان برابر با عبارات sort , date , fdisk بوده و در مسیرهای bin , /sbin/ قرار دارند:
# find /bin /sbin -name 'sort' -o -name 'date' -o -name 'fdisk'
/bin/date
/bin/sort
/sbin/fdisk
سوئیچ and- یا a- :
این سوئیچ نقش عملگر AND را ایفا می کند. بدین معنی که خروجی باید تمامی فیلترهای مورد نظر را دارا باشد.
مثال : جستجوی فایلی که نام آن شامل عبارات '1' , 'dir' باشد :
# find /root/sample -name '*1*' -a -name '*dir*'
/root/sample/dir_test_1
I دستور زیر نیز عملکردی مشابه با دستور بالا دارد.
# find /root/sample -name '*1*' '*dir*'
سوئیچ iname- :
برای اینکه لینوکس بین حروف کوچک و بزرگ حساس نباشد از این سوئیچ استفاده می شود.
# find /root/sample/ -iname '*FILE*'
/root/sample/dir_test_2/file_test_2
/root/sample/dir_test_3/file_test_3
/root/sample/dir_test_1/file_test_1
I حروف کوچک و بزرگ در لینوکس متمایز می باشند.
سوئیچ type- :
در لینوکس همه چیز، حتی یک سخت افزار به شکل فایل دیده می شود. با این سوئیچ عمل جستجو بدنبال نوع خاصی از فایل محدود می شود. در صورت عدم استفاده از این سوئیچ تفاوتی در نوع فایل های خروجی ایجاد نمی شود.
این سوئیچ کاربردی همراه با مقادیر زیر استفاده می شود.
block (buffered) special ç b ç
معرف یک ابزار ذخیره سازی فیزیکی و یا منطقی می باشد. مانند Hard Disk. زمانی که قرار به خواندن دسته ایی داده ها باشد از آن استفاده می شود.
# file /dev/sda
/dev/sda: block special
character (unbuffered) special ç c ç
یک فایل سخت افزاری است که زمان خواندن داده بصورت کاراکتر به کاراکتر استفاده می شود. مانند صفحه کلید
# file /dev/tty
/dev/tty: character special
directory ç d ç
دایرکتوری در لینوکس به عنوان یک نوع فایل دیده می شود که دسته بندی سایر فایل ها را انجام می دهد.
named pipe (FIFO) ç p ç
فایل ویژه ایی که می توان بصورت همزمان برای خواندن یا نوشتن بین چند پردازش به اشتراک گذاشته شود.
regular file ç f ç
فایل معمولی می باشد. مانند فایل باینری یا عکس
symbolic link ç l ç
منظور همان Soft Link بوده که به مانند Shortcut می باشد.
socket ç s ç
از این نوع فایل برای تبادل داده بین دو پردازش استفاده می شود.
مثال : جستجوی دایرکتوری های مسیر root/sample/ که در نامشان عبارت test وجود داشته باشد :
# find /root/sample -name '*test*' -type d
/root/sample/dir_test_2
/root/sample/dir_test_3
/root/sample/dir_test_1
مثال : جستجوی فایل های مسیر root/sample/ که در نامشان عبارت test وجود داشته باشد :
# find /root/sample -name '*test*' -type f
/root/sample/dir_test_2/file_test_2
/root/sample/dir_test_3/file_test_3
/root/sample/dir_test_1/file_test_1
سوئیچ not- یا علامت تعجب (!) :
همواره با استفاده از این سوئیچ می توان عملکرد سوئیچ های دیگر را برعکس نمود.
# find /root/sample -name '*2*' -type f
/root/sample/dir_test_2/file_test_2
# find /root/sample -not -name '*2*' -type f
/root/sample/dir_test_3/file_test_3
/root/sample/dir_test_1/file_test_1
I همینطور می توان بجای not- از علامت ! نیز استفاده نمود.
# find /root/sample ! -name '*2*' -type f
سوئیچ empty- :
با استفاده از این سوئیچ می توان فایل ها و دایرکتوری های خالی را پیدا کرد.
# find /root/sample -type f -empty
/root/sample/dir_test_1/file_test_1
/root/sample/dir_test_3/file_test_3
سوئیچ path- :
برای جستجو بر اساس مسیر دستیابی به فایل ها از این سوئیچ استفاده می شود.
# find /root/sample -type f -path '*2*'
/root/sample/dir_test_2/file_test_2
I با دستور بالا تمامی فایل هایی که آدرس دستیابی شان عبارت مورد نظر باشد نمایش می یابد.
سوئیچ user- :
با کمک این سوئیچ می توان عمل جستجو را بر اساس مالک فایل انجام داد.
# find /home -type f -user oracle
/home/oracle/.bash_profile
/home/oracle/.bashrc
/home/oracle/.kshrc
….
I با دستور بالا تمامی فایل هایی که در مسیر home/قرار دارند و کاربر مالک آن ها oracle باشد نمایش می یابد.
سوئیچ uid- :
با این سوئیچ می توان جستجو را بر اساس User ID انجام داد.
# find /home -type f -uid 1010
I با دستور بالا تمامی فایل هایی که در مسیر home/ قرار دارند و ID کاربر مالک آن ها 1010 باشد نمایش می یابد.
سوئیچ group- :
با کمک این سوئیچ می توان عمل جستجو را بر اساس گروه فایل انجام داد.
# find /home -type f -group school
I با دستور بالا تمامی فایل هایی که در مسیر home/ قرار دارند و گروه آن ها school باشد نمایش می یابد.
سوئیچ gid- :
با این سوئیچ می توان جستجو را بر اساس Group ID انجام داد.
# find /home -type f -gid 1000
I با دستور بالا تمامی فایل هایی که در مسیر home/ قرار دارند و ID گروه آن ها برابر با 1000 باشد نمایش می یابد.
سوئیچ mindepth , -maxdepth- :
از این سوئیچ برای تعیین سطح ابتدا و انتهای مسیر جستجو استفاده می شود.
· تعیین سطح ابتدا با استفاده از mindepth
· تعیین سطح انتها با استفاده از maxdepth
I در حالت عادی سطح صفر همان انتهای مسیر مشخص شده در دستور می باشد. بنابراین دستورات زیر خروجی یکسان دارند.
# find /root/sample = # find /root/sample/ -mindepth 0
/root/sample/
/root/sample/empty_file
/root/sample/dir_test_1
/root/sample/dir_test_1/file_test_1
/root/sample/dir_test_3
/root/sample/dir_test_3/file_test_3
/root/sample/dir_test_2
/root/sample/dir_test_2/file_test_2
I در دستور زیر فایل و دایرکتوری هایی در خروجی قرار می گیرند که سطح ابتدای آنها نسبت به root/sample/ یک سطح بالاتر باشد. مقداری برای سطح انتها مشخص نشده است.
# find /root/sample -mindepth 1
/root/sample/empty_file
/root/sample/dir_test_1
/root/sample/dir_test_1/file_test_1
/root/sample/dir_test_3
/root/sample/dir_test_3/file_test_3
/root/sample/dir_test_2
/root/sample/dir_test_2/file_test_2
I در دستور زیر فایل و دایرکتوری هایی در خروجی قرار می گیرند که سطح انتهای آنها نسبت به root/sample/ یک سطح بالاتر باشد. مقداری برای سطح ابتدا مشخص نشده است.
# find /root/sample -maxdepth 1
/root/sample/
/root/sample/empty_file
/root/sample/dir_test_1
/root/sample/dir_test_3
/root/sample/dir_test_2
I در دستور زیر فایل و دایرکتوری هایی در خروجی قرار می گیرند که سطح ابتدا و انتهای آنها نسبت به root/sample/ یک سطح بالاتر باشد.
# find /root/sample -mindepth 1 -maxdepth 1
/root/sample/empty_file
/root/sample/dir_test_1
/root/sample/dir_test_3
/root/sample/dir_test_2
I در دستور زیر عمل جستجو میان فایل و دایرکتوری هایی که در نامشان عبارت lvm وجود دارد و در محدوده ی تعیین شده قرار دارند انجام می شود.
# find / -name '*lvm*' -mindepth 2 -maxdepth 3
/etc/lvm
/sbin/lvmconf
/sbin/lvm
/var/run/lvm
/var/lock/lvm
/usr/sbin/system-config-lvm
/usr/bin/system-config-lvm
/etc/lvm/lvm.conf
/etc/pam.d/system-config-lvm
/lib64/device-mapper/libdevmapper-event-lvm2raid.so
/lib64/device-mapper/libdevmapper-event-lvm2mirror.so
….