آشنایی با نحوه ی یافتن فایل ها در لینوکس


دستور locate این امکان را به ما می‌دهد تا از طریق کامند لاین اقدام به جستجوی فایل/دایرکتوری خاصی نماییم. locate اقدام به گشت زنی در دیتابیسی که قبلاً کلیه ی فایل‌ها و دایرکتوری ها در آن به ثبت رسیده‌اند می‌کند و هر چیزی که با کلیدواژگان مد نظر ما همخوانی داشته باشد را در معرض دیدمان قرار می‌دهد که گاهی اوقات لیست نتایج جستجو بسیار طولانی می گردد.

برای آن که لیستی کوتاه‌تر و در عین حال دقیق‌تری از نتایج جستجو داشته باشیم، می‌توانیم از دستور grep استفاده کنیم. برای روشن‌تر شدن این مسأله، مثالی می زنیم:

locate zip

دستور فوق هر فایل/دایرکتوری که حاوی حروف zip باشد را می‌یابد اما ما نیاز داریم تا فقط آن‌هایی که علاوه بر zip حاوی عبارت bin هم هستند، نمایش داده شوند. در چنین صورتی، از دستور زیر استفاده می‌کنیم:

locate zip | grep bin

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

آشنایی با کاربرد پایپ ها در لینوکس
فلسفه ی سیستم عامل های مبتنی بر یونیکس این است که امکانی در اختیار کاربران قرار داده شود تا بتوانند با ترکیب دو یا چند کامند ساده، دستورات پیچیده یی خلق کنند. در همین راستا، امکانی در سیستم عامل گنو/لینوکس فراهم شده تا با به کارگیری از علامت | (پایپ به معنی لوله) نیازهای خود را مرتفع سازند:

command1 | command2 | command3

چنین دستوری اصطلاحاً Pipeline (پاپ لاین یا خط لوله) نامیده می‌شود به طوری که از آن طریق، چندین دستور مختلف در قالب یک دستور اجرا می گردد.

پیش از این گفتیم که دستور locate از دیتابیسی که توسط سیستم ساخته می‌شود برای یافتن کلیدواژگان جستجو شده استفاده می کند. این دیتابیس نامش updatedb است که بسیاری از توزیع‌های لینوکسی آن را به صورت خودکار روزی یک بار اجرا می‌کنند تا اطلاعات دیتابیس به روز رسانی شود. به هر حال، اگر تمایل داشته باشید با وارد کردن کامند updatedb در ترمینال به صورت دستی، می‌توانید این دیتابیس را به روز رسانی کنید (حتماً به خاطر داشته باشید که برای اجرای این دستور نیاز به سطح دسترسی روت خواهید داشت.)

sokanacademy@sokanacademy-inspiron-1545:/$ sudo updatedb
[sudo] password for sokanacademy: 

قبل از دستور updatedb از کامند sudo استفاده می کنیم تا بتوانیم سطح دسترسی کاربری را به روت تغییر دهیم: ابتدا از ما خواسته می شود که پسورد روت را وارد کنیم و پس از وارد کردن پسورد، چند ثانیه یی به طول خواهد انجامید تا دیتابیس آپدیت شود.

کاربردهای دستور ls در لینوکس
برای نمایش لیستی از فایل ها و دایرکتوری ها، از دستور ls استفاده می شود؛ دستور ls آپشن های مختلفی دارا است که از جمله ی مهم ترین آن ها می توان به موارد زیر اشاره کرد:

آپشن کاربرد
ls -l حرف l از ابتدای واژه ی Long به معنی «طولانی» گرفته شده است. این آپشن فرمتی طولانی از اطلاعات فایل /دایرکتوری ها را نمایش می دهد که از آن جمله می توان به پرمیشن ها، حجم فایل، تاریخ تغییر فایل، مالکیت فایل و ... اشاره کرد.
ls -a حرف a از ابتدای کلمه ی All به معنی «همه» گرفته شده و کاری که این آپشن انجام می دهد این است که تمامی فایل ها من جمله فایل های Hiddden یا «پنهان» را نیز نمایش می دهد.
ls -d حرف d از ابتدای Directory به معنی «پوشه» گرفته شده است و استفاده از این آپشن صرفا دایرکتوری ها را لیست می کند.
ls -R حرف R از ابتدای کلمه ی Recursive به معنی «بازگشتی» گرفته شده و کاری که انجام می دهد این است که تک تک دایرکتوری ها و همچنین کلیه ی محتویات داخل آن را نمایش می دهد.

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

ls -option

همان طور که مشاهده می شود، ابتدا دستور ls را می نویسیم سپس اگر قصد استفاده از آپشن خاصی را داشته باشیم، یک فاصله قرار می دهیم یک علامت - می گذاریم و آپشن مد نظر را وارد می کنیم. برای روشن تر شدن نحوه ی به کارگیری از دستور ls، به ذکر چند مثال اکتفا می کنیم. ابتدا وارد مسیر روت شده سپس دستور ls را اجرا می کنیم:

sokanacademy@sokanacademy-inspiron-1545:/$ ls

به عنوان خروجی دستور فوق داریم:

bin    Documents   initrd.img.old             media   proc  snap  usr
boot   etc         KindleForPC-installer.exe  mnt     root  srv   var
cdrom  home        lib                        Moradi  run   sys   vmlinuz
dev    initrd.img  lost+found                 opt     sbin  tmp   vmlinuz.old

حال قصد داریم تا یک آپشن را هم به همراه دستور ls مورد استفاده قرار دهیم. برای نمایش اطلاعات بیشتری از فایل ها و دایرکتوری های قرار گرفته در روت، از آپشن l- استفاده می کنیم:

sokanacademy@sokanacademy-inspiron-1545:/$ ls -l

به عنوان خروجی دستور فوق داریم:

total 39964
drwxr-xr-x   2 root root    12288 Jul 28 06:28 bin
drwxr-xr-x   3 root root     4096 Jul 28 06:43 boot
drwxr-xr-x   2 root root     4096 Apr 14  2014 cdrom
drwxr-xr-x  22 root root     4640 Jul 29 10:58 dev
-rwxrwxrwx   1 root root        0 Oct  3  2014 Documents
drwxr-xr-x 173 root root    12288 Jul 28 06:43 etc
drwxr-xr-x   3 root root     4096 Apr 14  2014 home
lrwxrwxrwx   1 root root       32 Jul 17 08:05 initrd.img -> boot/initrd.img-4.4.0-31-generic
lrwxrwxrwx   1 root root       32 Jul  4 23:14 initrd.img.old -> boot/initrd.img-4.4.0-28-generic
-rw-r--r--   1 root root 40790520 Feb 10  2015 KindleForPC-installer.exe
drwxr-xr-x  25 root root     4096 Jul 28 06:25 lib
drwx------   2 root root    16384 Apr 14  2014 lost+found
drwxr-xr-x   3 root root     4096 Apr 14  2014 media
drwxr-xr-x   2 root root     4096 Apr 22 08:56 mnt
-rwxrwxrwx   1 root root        0 Oct  3  2014 Moradi
drwxr-xr-x  10 root root     4096 Apr  1 06:37 opt
dr-xr-xr-x 255 root root        0 Jul 29 15:25 proc
drwx------  28 root root     4096 May 22 12:45 root
drwxr-xr-x  38 root root     1160 Jul 29 15:41 run
drwxr-xr-x   2 root root    12288 Jul 28 06:29 sbin
drwxr-xr-x   2 root root     4096 Apr 19 19:01 snap
drwxr-xr-x   2 root root     4096 Oct 16  2013 srv
dr-xr-xr-x  13 root root        0 Jul 29 15:25 sys
drwxrwxrwt  14 root root    20480 Jul 29 16:39 tmp
drwxr-xr-x  11 root root     4096 Mar  3 03:47 usr
drwxr-xr-x  15 root root     4096 Apr 22 09:48 var
lrwxrwxrwx   1 root root       29 Jul 17 08:05 vmlinuz -> boot/vmlinuz-4.4.0-31-generic
lrwxrwxrwx   1 root root       29 Jul  4 23:14 vmlinuz.old -> boot/vmlinuz-4.4.0-28-generic

می بینیم که اطلاعات به مراتب جامع تری در معرض دیدمان قرار می گیرد. علاوه بر این، به خاطر داشته باشیم که به صورت هم زمان از چندین آپشن مختلف هم می توان برای تمامی کامندهای لینوکس استفاده کرد. به عنوان مثال، اگر بخواهیم هم اطلاعات جامعی از فایل/دایرکتوری ها نمایش دهیم و هم فایل های پنهان را نمایش دهیم، می توانیم از کامند زیر استفاده نماییم:

ls -l -a

به عنوان راه کاری جایگزین، می توان هر دو آپشن را در هم ادغام نمود:

ls -la

به عنوان خروجی هر دو کامند فوق داریم:

total 39972
drwxr-xr-x  23 root root     4096 Jul 25 08:32 .
drwxr-xr-x  23 root root     4096 Jul 25 08:32 ..
drwxr-xr-x   2 root root    12288 Jul 28 06:28 bin
drwxr-xr-x   3 root root     4096 Jul 28 06:43 boot
drwxr-xr-x   2 root root     4096 Apr 14  2014 cdrom
drwxr-xr-x  22 root root     4640 Jul 29 10:58 dev
-rwxrwxrwx   1 root root        0 Oct  3  2014 Documents
drwxr-xr-x 173 root root    12288 Jul 28 06:43 etc
drwxr-xr-x   3 root root     4096 Apr 14  2014 home
lrwxrwxrwx   1 root root       32 Jul 17 08:05 initrd.img -> boot/initrd.img-4.4.0-31-generic
lrwxrwxrwx   1 root root       32 Jul  4 23:14 initrd.img.old -> boot/initrd.img-4.4.0-28-generic
-rw-r--r--   1 root root 40790520 Feb 10  2015 KindleForPC-installer.exe
drwxr-xr-x  25 root root     4096 Jul 28 06:25 lib
drwx------   2 root root    16384 Apr 14  2014 lost+found
drwxr-xr-x   3 root root     4096 Apr 14  2014 media
drwxr-xr-x   2 root root     4096 Apr 22 08:56 mnt
-rwxrwxrwx   1 root root        0 Oct  3  2014 Moradi
drwxr-xr-x  10 root root     4096 Apr  1 06:37 opt
dr-xr-xr-x 255 root root        0 Jul 29 15:25 proc
drwx------  28 root root     4096 May 22 12:45 root
drwxr-xr-x  38 root root     1160 Jul 29 15:41 run
drwxr-xr-x   2 root root    12288 Jul 28 06:29 sbin
drwxr-xr-x   2 root root     4096 Apr 19 19:01 snap
drwxr-xr-x   2 root root     4096 Oct 16  2013 srv
dr-xr-xr-x  13 root root        0 Jul 29 16:39 sys
drwxrwxrwt  14 root root    20480 Jul 29 16:39 tmp
drwxr-xr-x  11 root root     4096 Mar  3 03:47 usr
drwxr-xr-x  15 root root     4096 Apr 22 09:48 var
lrwxrwxrwx   1 root root       29 Jul 17 08:05 vmlinuz -> boot/vmlinuz-4.4.0-31-generic
lrwxrwxrwx   1 root root       29 Jul  4 23:14 vmlinuz.old -> boot/vmlinuz-4.4.0-28-generic

همواره به خاطر داشته باشیم که دستور ls محتویات پوشه یی که داخل آن قرار داریم را نمایش می دهد اما همیشه این امکان را داریم تا از هر کجای فایل سیستم لینوکس، محتویات سایر دایرکتوری ها را نیز مشاهده کنیم. به طور مثال فرض کنیم که داخل دایرکتوری هوم قرار داریم اما می خواهیم محتوایات دایرکتوری etc که در اکثر توزیع های لینوکسی وجود دارد را ببینیم. برای این منظور، از کامند زیر استفاده خواهیم کرد:

sokanacademy@sokanacademy-inspiron-1545:/$ ls /etc

کامند فوق کلیه ی محتویات دایرکتوری etc که در روت سیستم قرار دارد را نمایان خواهد ساخت.

نکته
فایل/دایرکتوری های پنهان یا Hidden به فایل/دایرکتوری هایی گفته می‌شود که نام آن‌ها با یک . شروع می شود. برای مثال، دایرکتوری fonts. یک دایرکتوری پنهان است. زمانی که اکانت کاربری شما در سیستم عامل گنو/لینوکس ساخته می شود، چندین فایل پنهان در دایرکتوری هوم شما ساخته می شوند که مسئول پیکربندی اکانت شما هستند. علاوه بر این، برخی از اپلیکیشن ها نیز فایل های پیکربندی (Configuration) خود را به عنوان فایل های Hidden در این دایرکتوری قرار می دهند.

جستجوی دقیق تر با استفاده از Wildcard ها در لینوکس
برای جستجوی دقیق‌تر، می‌توان از Wildcard های زیر استفاده کرد:

وایلدکارد کاربرد
? برای تک تک کاراکترهایی که همخوانی داشته باشند.
* برای چند کاراکتر
[set] طیفی از کاراکترهایی که می بایست وجود داشته باشند را تعریف می کنیم.
[!set] طیفی از کاراکترهایی که نمی بایست وجود داشته باشند را تعریف می کنیم.

برای روشن‌تر شدن کاربرد وایلدکاردها، به ذکر چند مثال اکتفا می کنیم؛ برای یافتن کلیه ی فایل‌هایی که ابتدای آن های با initr شروع شود، سپس یک حرف دیگر به عنوان حرف آخر آن‌ها بوده و پسوند آن هم img. باشد، از دستور زیر استفاده می کنیم:

ls initr?.img

برای یافتن کلیه ی فایل‌هایی که پسوند آن‌ها img. است از کامند زیر استفاده می کنیم:

ls *.img

برای یافتن کلیه ی فایل‌هایی که ابتدای آن‌ها با حرف initr شروع شده و حرف بعدی آن یکی از حروف مابین a تا z بوده و پسوند فایل هم img. باشد، از دستور زیر استفاده می کنیم:

ls initr[a-z].img

برای یافتن کلیه ی فایل‌هایی که ابتدای آن‌ها با حرف initr شروع شده و حرف بعدی آن یکی از حروف مابین e تا k نباشد و پسوند فایل هم img. باشد، از دستور زیر استفاده می کنیم:

ls initr[!e-k].img

یافتن فایل‌ها و دایرکتوری ها از طریق کامند لاین لینوکس
دستور find یکی از دستورات پرکاربرد در لینوکس برای ادمین های سیستم است. این دستور، فایل سیستم لینوکس را می‌گردد و کلیه ی فایل‌ها و یا دایرکتوری هایی که با معیارهای در نظر گرفته شده همخوانی داشته باشد را می‌یابد.

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

آپشن کاربرد
name- برای فایل‌هایی که دارای الگوی خاصی در نامشان هستند.
iname- بزرگی و کوچکی حروف را نادیده می‌گیرد.
type- فایل‌های یافته شده را بر اساس نوع فایل محدود می سازد؛ مثلاً برای محدود کردن به دایرکتوری ها، از حرف d و برای محدود کردن به فایل‌های معمولی از حرف f استفاده می‌شود.

برای روشن‌تر شدن کاربرد این کامند، چند مثال می زنیم. برای جستجوی کلیه ی فایل‌ها و دایرکتوری های تحت عنوان gcc در دایرکتوری usr/ از کامند زیر استفاده می شود:

find /usr -name gcc

برای جستجوی صرفاً دایرکتوری های تحت عنوان gcc در دایرکتوری usr/ از دستور زیر استفاده می شود:

find /usr -type d -name gcc

و برای جستجوی فایل‌های معمولی تحت عنوان test1 در دایرکتوری usr/ هم از دستور زیر استفاده می شود:

find /usr -type f -name test1

پیش از این گفتیم که اگر آرگومان خاصی برای دستور find در نظر نگیریم، این دستور مسیری که داخل آن قرار داریم را جستجو می‌کند اما همان‌طور که در کامندهای فوق می بینیم، مسیر usr/ را به عنوان دایرکتوری قابل جستجو در نظر گرفته‌ایم که علاوه بر این دایرکتوری، کلیه ی دایرکتوری های زیرشاخه ی آن نیز جستجو خواهند شد.

کاربردهای پیشرفته ی دستور find
یکی از موارد استفاده ی کاربردی دستور find برای اجرای دستوراتی روی فایل‌هایی است که با معیارهای جستجوی ما همخوانی دارند. آپشن exec- این امکان را به کاربران لینوکس می‌دهد تا دستورات مد نظر خود را روی فایل‌ها اعمال کنند. به طور مثال، برای یافتن کلیه ی فایل‌هایی که پسوند آن‌ها txt. است و روی دسکتاپ داخل پوشه یی تحت عنوان test هستند از کامند زیر استفاده می شود:

find -name "*.txt" -exec rm {} ';'

علامت های {} محلی برای ذخیره سازی فایل‌های جستجو شده است. در ارتباط با این دستور حتماً به خاطر داشته باشیم که می بایست دستور خود را با ';' به پایان برسانیم (البته در عوض از علامت های ;\ هم می‌توانیم استفاده کنیم.) به عنوان راه‌کاری جایگزین برای دستور exec، از دستوری تحت عنوان ok- نیز می‌توان استفاده کرد. کاربرد این دو دستور کاملاً به یکدیگر شبیه است با این تفاوت که در صورت استفاده از دستور ok- اجازه ی اجرای دستور باید از طرف کاربر صادر شود؛ مزیت دستور ok- این است که هرگز سهواً اقدام به اجرای دستوارتی مخرب -همچون پاک کردن- نخواهیم پرداخت.

یافتن فایل‌ها بر اساس حجم
گاهی اوقات کاربران لینوکسی نیاز دارند تا بر اساس حجم فایل‌ها، اقدام به جستجو کنند که چنین کاری با استفاده از دستور find به سادگی امکان‌پذیر است:

find / -size 0

به عنوان مثالی دیگر، برای یافتن فایل‌های بزرگ‌تر از ۱۰ مگابایت، می بایست از دستور زیر استفاده کرد:

find / -size +10M

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

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
Amin Zaherdannak
Amin Zaherdannak
۱۳۹۵/۱۲/۰۱
سلام
یه مثالی از find زدین توی آموزش:
find -name "*.txt" -exec rm ...
یه مقدار گنگه. اینکه توی دایرکتوری به اسم test توی دسکتاپ میگرده رو کجا تعیین کردیم؟ راجب rm و {} هم یه مقدار بیشتر توضیح بدین بهتر میشه
ممنون بابت آموزشای فوق العاده ای که گذاشتین