find - جستجوی فایل‌ها

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

شکل کلی دستور:

$ find [options] [file]

قبل از شروع یک پوشه در home directoryتون درست کنین به اسم find و یک فایل متنی به اسم create_sample_files.sh که داخلش کدهای زیر باشه در پوشه find قرار بدین. توضیح کدها در زیر آمده.

touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c

mkdir backup
cd backup

touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c

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

chmod +x ~/find/create_sample_files.sh

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

قبل از زدن دستور اجرا، وارد find شوید.

cd ~/find/

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

./create_sample_files.sh

حالا اگر به پوشه find برین این فایل‌ها باید توش باشه:

backup                  MybashProgram.sh  MyCProgram.c
create_sample_files.sh  mycprogram.c      Program.c

و داخل پوشه bckup این فایل‌ها باید باشه:

MybashProgram.sh  mycprogram.c  MyCProgram.c  Program.c

سبکی که این‌جا دستور find رو توضیح می‌دم به سبکی هست که در لینک زیر توضیح داده شده:

http://www.thegeekstuff.com/2009/03/15-practical-linux-find-command-exam...

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

touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c

چهار تا دستور touch استفاده شده که برای تغییر time stamp یک فایل هست و اگر اون فایل وجود نداشته باشه اون رو می‌سازه.

mkdir backup
cd backup

touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c

خط اول برای ساخت یک پوشه هست به اسم backup (اطلاعات بیشتر به دستور mkdir رجوع کنین)، خط دوم برای وارد شدن به پوشه backup هست (به دستور cd رجوع کنین)، چهار دستور بعد (touch) در بالا توضیح داده شد.

پیدا کردن فایل بر اساس نام

name-: حساس به حروف بزرگ و کوچک.

aliabry@lp:~$ find -name "MyCProgram.c"
./find/backup/MyCProgram.c
./find/MyCProgram.c

در بالا هرچی فایل به اسم "MyCProgram.c" در پوشه جاری و زیر دایرکتوری‌های اون (sub directory) باشه رو پیدا می‌کنه.

نکته: دستور find جستجو رو در همون دایرکتوری که هم‌اکنون هستین و زیر دایرکتوری‌های اون انجام می‌ده اگر می‌خواین مکان تعیین کنین زیر رو نگاه کنین.

iname-: غیر حساس به حروف بزگ و کوچک.

aliabry@lp:/$ find ~/find/ -iname "MyCProgram.c"
/home/aliabry/find/backup/MyCProgram.c
/home/aliabry/find/backup/mycprogram.c
/home/aliabry/find/MyCProgram.c
/home/aliabry/find/mycprogram.c

در بالا همون‌طور که می‌بینین به حروف بزرگ و کوچک حساس نبود.

عکس کردن نتایج جست و جو به وسیله not-

وقتی از not-استفاده می‌کنین نتایج رو به صورت عکس نشون میده. یعنی اونایی که مچ نشدن رو نشون میده.  دستور زیر رو داخل خود پوشه find اجرا کنین:

aliabry@lp:~/find$ find -not -iname "MyCProgram.c"
.
./backup
./backup/Program.c
./backup/MybashProgram.sh
./Program.c
./create_sample_files.s
./MybashProgram.sh

همون‌طور که می‌بینین هرچی اسمش "MyCProgram.c" نبوده رو لیست کرده.

پیدا کردن بر اساس شماره inode به وسیله inum-

هر فایلی که در سیستم شما ساخته می‌شه بهش یک عدد اختصاص داده می‌شه. که اون عدد خود یک فایل هست که اطلاعاتی مثل زمان ساخته شدن، نوع، اجازه و... در اون ذخیره می‌شود. برای اطلاعات بیشتر به این آدرس بروید:

http://www.thegeekstuff.com/2012/01/linux-inodes/

برای پیدا کردن شماره inode یک فایل از دستور ls -liاستفاده کنین مثلا برای من در پوشه find به این شکل هست:

aliabry@lp:~/find$ ls -li
total 8
2155095 drwxrwxr-x 2 aliabry aliabry 4096 Feb 26 14:16 backup
2146246 -rwxrwxr-x 1 aliabry aliabry  179 Feb 26 14:16 create_sample_files.s
2146248 -rw-rw-r-- 1 aliabry aliabry    0 Feb 26 14:16 MybashProgram.sh
2146250 -rw-rw-r-- 1 aliabry aliabry    0 Feb 26 14:16 mycprogram.c
2146253 -rw-rw-r-- 1 aliabry aliabry    0 Feb 26 14:16 MyCProgram.c
2146272 -rw-rw-r-- 1 aliabry aliabry    0 Feb 26 14:16 Program.c

حالا برای پیدا کردن فایل "Program.c" بر اساس شماره inode دستور به این شکل می‌شه:

aliabry@lp:~/find$ find -inum 2146272
./Program.c

همون‌طور که می‌بینین  Program.c که داخل پوشه backup بود رو نیاورد.

اجرای دستور بر روی فایل‌هایی که پیدا می‌شوند

برای این کار دستورتون رو بین exec-و  ;\ {}قرار بدین. مثلا در زیر دستور ls -liرو بر روی فایلی که پیدا می‌شود انجام می‌دیم.

aliabry@lp:~/find$ find -inum 2146253 -exec ls -li {} \;
2146253 -rw-rw-r-- 1 aliabry aliabry 0 Feb 26 14:16 ./MyCProgram.c

نکته: به فاصله بین {}و ;\توجه کنین.

پیدا کردن بر اساس اجازه‌نامه

اگر به مبحث اجازه‌ها آشنایی ندارین در دستور chmod کامل توضیح داده شده.

این کار رو می‌شه به چندین شکل انجام داد که هر روش ویژگی‌های خودش رو داره. دو روش رو این‌جا می‌گیم:

۱. متچ شدن دقیق پرمیشن

در این حالت فقط اون پرمیشنی که دادیم جستجو میشه. یعنی در مثال زیر فقط فایل‌های با پرمیشن ۷۷۵ متچ می‌شن.

aliabry@lp:~/find$ find -perm 775
.
./backup
./create_sample_files.s

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

aliabry@lp:~/find$ find -perm u+rwx,g+rwx,o+rx

۲. متچ شدن تمام فایل‌هایی که پرمیشن داده شده رو دارن

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

به -قبل از عدد 040توجه داشته باشین.

aliabry@lp:~/find$ find -perm -040
.
./backup
./backup/MyCProgram.c
./backup/mycprogram.c
./backup/Program.c
./backup/MybashProgram.sh
./MyCProgram.c
./mycprogram.c
./Program.c
./create_sample_files.s
./MybashProgram.sh

شکل استرینگ دستور بالا:

به -قبل از gتوجه داشته باشین.

aliabry@lp:~/find$ find -perm -g+r
.
./backup
./backup/MyCProgram.c
./backup/mycprogram.c
./backup/Program.c
./backup/MybashProgram.sh
./MyCProgram.c
./mycprogram.c
./Program.c
./create_sample_files.s
./MybashProgram.sh

جستجو بر اساس نوع فایل به وسیله type-
 جستجو رو می‌تونین بر اساس نوع فایل پیش ببرین که فایل‌ها به نوع‌های زیر تقسیم می‌شوند:

b      block (buffered) special

c      character (unbuffered) special

d      directory

p      named pipe (FIFO)

f      regular file

s      socket

D      door (Solaris)

مثلا برای پیدا کردن دایرکتوری به اسم backup:

aliabry@lp:~/find$ find -name backup -type d
./backup

جستجو بر اساس سایز فایل

این‌کار رو می‌شه به سه روش انجام داد:

NUM+: پیدا کردن فایل با سایز بزرگ‌تر از NUM

NUM-: پیدا کردن فایل با سایز کوچک‌تر از NUM

NUM: پیدا کردن فایل با سایز دقیقا NUM

مثلا در زیر فایل‌های بزرگ‌تر از ۱۰ مگابایت رو در home directoryمون جستجو می‌کنیم.

aliabry@lp:~$ find ~ -size +10M
/home/aliabry/digitv_server_kontainer_1.wmv
/home/aliabry/digitv_server_kontainer_3.wmv
/home/aliabry/digitv_server_kontainer_2.wmv

برای کیلوبایت از Kو برای گیگابایت از Gاستفاده کنین.

نکته: کیلوبایت، مگابایت و گیگابایت در دستور find بر اساس بایت‌های ۱۰۲۴ تایی محاسبه می‌شوند. یعنی یک مگابایت ۱۰۲۴ کیلوبایت هستش نه ۱۰۰۰ کیلوبایت.

جستو جو بر اساس زمان ساخت، دسترسی، تغییر

Access time (زمان دسترسی): هروقت که وارد یک دایرکتوری می‌شین یا یک فایل رو باز می‌کنین زمان  access  اون فایل تغییر می‌کند. (amin،atime)

Modification time (زمان تغییر و تبدیل و یا زمانی که فایل ساخته شده): وقتی تغییر می‌کند که در محتویات فایل تغییر ایجاد شود. (mmin،mtime)

Change time (زمان تغییر): وقتی تغییر می‌کند که inode اون فایل تغییر کند. (cmin،ctime)

minبرای جستجو بر اساس دقیقه و از timeبرای جستجو بر اساس ۲۴ ساعت هست.

-(منفی): به‌معنی کمتر از .

+(مثبت): به‌معنی بیشتر از.

برای پیدا کردن فایل‌هایی که در کمتر از ۶۰ دقیقه گذشته Access time شون تغییر کرده:

find -amin -60

برای پیدا کردن فایل‌هایی که در  ۶۰ دقیقه گذشته Access time شون تغییر نکرده (یعنی در ۶۰ دقیقه گذشته بهشون رجوع نکردین).

find -amin +60

برای پیدا کردن فایل‌هایی که Access time شون در ۳۰ روز گذشته تغییر نکرده (یعنی از ۳۰ روز گذشته تا الان یک‌بار هم به اون فایل مراجعه نکردین)

find -atime +30

برای پیدا کردن فایل‌هایی که در کمتر از ۲ روز گذشته Access time شون تغییر کرده. (یعنی در ۴۸ ساعت گذشته حداقل یک‌بار به اون فایل مراجعه کردین)

find -atime -2

نکته: دستور find کسر ساعت رو برای نوع ۲۴ ساعته (time) حساب نمی‌کنه. یعنی اگر فایلتون در ۳۶ ساعت گذشته بهش دسترسی داشتین و atime +1- رو بزنین جزو نتایج نمیاره چون ۳۶ رو همون ۲۴ در نظر می‌گیره و از اون‌جایی که ۳۶ رو ۲۴ در نظر می‌گیره اگر atime -2-  بزنین جزو نتایج میاره چون ۳۶ رو ۲۴ در نظر می‌گیره و ۲۴ کمتر از ۴۸ که برای ۲ روز هست می‌باشد.

برای  mmin،mtime،cmin،ctimeهم مثل دستورات بالا هست.

mount-: وقتی یک پارتیشن رو موینت می‌کنیم به عنوان یک پوشه که درگاه ورودی به اون پارتیشن هست (mount point) ظاهر می‌شه. خب حالا اگر اون پوشه تو بازه فایلایی که داریم جستجوشون می‌کنیم باشه دستور find داخل اون پارتیشن رو هم به واسطه اون mount point شروع به جستجو می‌کند. برای این‌که بگیم داخل پارتیشن‌هایی که موینت شدن رو جستجو نکند از این آپشن استفاده کنین. برای اطلاعات بیشتر در مورد mount point دستور mount رو بخونین.

تعیین حداقل و حداکثر عمق جستجو

maxdepth NUMBER-: حداکثر عمق

mindepth NUMBER-: حداقل عمق

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

مثلا خروجی زیر رو در نظر بگیرین (برای من چند دقیقه طول کشید تا نتیجش کامل بشه):

aliabry@lp:~/find$ sudo find / -iname passwd
[sudo] password for aliabry:
/etc/pam.d/passwd
/etc/init.d/passwd
/etc/passwd
/etc/cron.daily/passwd
/usr/share/doc/passwd
/usr/share/lintian/overrides/passwd
/usr/bin/passwd

خب حالا اگر بخوایم بگیم که تمام فایل‌های به اسم passwd رو تا دو ساب دایرکتوری پیدا کنه، میام maxdepth رو ۳ می‌ذاریم. (۱: پوشه روت. ۲: اولین ساب دایرکتوری(در خروجی بالا etc/ و usr/ )  و ۳: ساب دایرکتوری لایه دوم که در خروجی بالا می‌شه pam.d , init.d , cron.daily , share , bin).

نکته: روت دایرکتوری‌مون همیشه شماره یک رو به خودش اختصاص میده.

aliabry@lp:~/find$ sudo find / -maxdepth 3 -mount -iname passwd
[sudo] password for aliabry:
/etc/pam.d/passwd
/etc/init.d/passwd
/etc/passwd
/etc/cron.daily/passwd
/usr/bin/passwd

خوب حالا اگر بخوایم بگیم از subdirectory دوم الی سوم هرچی passwd بود رو پیدا کنه دستور به شکل زیر می‌شه:

aliabry@lp:~/find$ sudo find / -mindepth 3 -maxdepth 4 -mount -iname passwd
/etc/pam.d/passwd
/etc/init.d/passwd
/etc/cron.daily/passwd
/usr/share/doc/passwd
/usr/bin/passwd

جستو جو بر اساس نام کاربری و شماره‌ی نام کاربری (UID)

با کمک اپشنuser-- میتونیم فایل هایی که مالکیتشون برای کاربر خاصی هست رو پیدا کنیم

با کمک اپشن uid- می تونیم فایل هایی که مالکیتشون مربوط به uid خاصی هست رو پیدا کنیم .

مطالعه بیشتر

http://www.thegeekstuff.com/2009/06/15-practical-unix-linux-find-command...