نحوه استفاده از Find and Locate برای جستجوی فایل ها در لینوکس

مقدمه

یکی از مشکلاتی که کاربران در اولین یادگیری نحوه کار با لینوکس با آن مواجه می شوند این است که چگونه فایل های مورد نظر خود را پیدا کنند. این راهنما نحوه استفاده از دستور find با نام مناسب را پوشش می دهد. این به شما کمک می کند تا فایل های موجود در سیستم خود را با استفاده از فیلترها و پارامترهای مختلف جستجو کنید. همچنین به طور خلاصه دستور locate را پوشش می دهد که می تواند برای جستجوی فایل ها به روشی متفاوت استفاده شود.

پیش نیاز ها
  • برای دنبال کردن این راهنما، باید به رایانه‌ای که دارای سیستم عامل مبتنی بر لینوکس است دسترسی داشته باشید. این می تواند یک سرور خصوصی مجازی باشد که با SSH یا ماشین محلی خود به آن متصل شده اید. توجه داشته باشید که این آموزش با استفاده از یک سرور لینوکس که اوبونتو 20.04 را اجرا می کند تأیید شده است، اما مثال های ارائه شده باید روی رایانه ای که هر نسخه از هر توزیع لینوکس را اجرا می کند کار کند.

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

واضح ترین راه برای جستجوی فایل ها با نام آنهاست.برای پیدا کردن یک فایل با نام با دستور find، باید از دستور زیر استفاده کنید:

find -name "query"

این به حروف کوچک و بزرگ حساس خواهد بود، به این معنی که جستجو برای پرس و جو با جستجو برای Query متفاوت است. برای پیدا کردن یک فایل با نام اما نادیده گرفتن حروف موردی پرس و جو، از گزینه -iname استفاده کنید:

find -iname "query"

اگر می‌خواهید همه فایل‌هایی را پیدا کنید که به یک الگوی خاص پایبند نیستند، می‌توانید جستجو را با -not معکوس کنید:

find -not -name "query_to_avoid"

از طرف دیگر، می توانید جستجو را با استفاده از علامت تعجب (!) معکوس کنید، مانند این:

find \! -name "query_to_avoid"

توجه داشته باشید که اگر از ! استفاده می کنید، باید با علامت بک اسلش (\) از کاراکتر فرار کنید تا قبل از اینکه find بتواند آن را تفسیر کند، پوسته سعی در تفسیر آن نداشته باشد.

یافتن بر اساس نوع

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

find -type type_descriptor query

در اینجا برخی از توصیفگرهایی وجود دارد که می توانید برای تعیین نوع فایل از آنها استفاده کنید:

  • f: فایل معمولی
  • d: دایرکتوری
  • l: پیوند نمادین
  • c: دستگاه های شخصیت
  • b: دستگاه ها را مسدود می کند

به عنوان مثال، اگر می‌خواهید تمام دستگاه‌های کاراکتر سیستم خود را پیدا کنید، می‌توانید این دستور را صادر کنید:

find /dev -type c

این دستور به طور خاص فقط دستگاه‌هایی را در پوشه /dev جستجو می‌کند، دایرکتوری که فایل‌های دستگاه معمولاً در سیستم‌های لینوکس نصب می‌شوند:

Output
/dev/vcsa5
/dev/vcsu5
/dev/vcs5
/dev/vcsa4
/dev/vcsu4
/dev/vcs4
/dev/vcsa3
/dev/vcsu3
/dev/vcs3
/dev/vcsa2
/dev/vcsu2
/dev/vcs2
. . .

می توانید تمام فایل هایی را که به .conf ختم می شوند با دستوری مانند زیر جستجو کنید. این مثال فایل های منطبق را در پوشه /usr جستجو می کند:

find /usr -type f -name "*.conf"
Output
/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf
/usr/share/adduser/adduser.conf
/usr/share/ufw/ufw.conf
/usr/share/popularity-contest/default.conf
/usr/share/byobu/keybindings/tmux-screen-keys.conf
/usr/share/libc-bin/nsswitch.conf
/usr/share/rsyslog/50-default.conf
. . .

فیلتر کردن بر اساس زمان و اندازه

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

اندازه

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

  • c: بایت
  • k: کیلوبایت
  • m: مگابایت
  • g: گیگابایت
  • b: بلوک های 512 بایتی

برای نشان دادن، دستور زیر هر فایلی را در پوشه /usr که دقیقاً 50 بایت است پیدا می کند:

find /usr -size 50c

برای پیدا کردن فایل‌هایی که کمتر از 50 بایت هستند، می‌توانید از این نحو استفاده کنید:

find /usr -size -50c

برای یافتن فایل هایی در پوشه /usr که بیش از 700 مگابایت هستند، می توانید از این دستور استفاده کنید:

find /usr -size +700M
زمان

برای هر فایل روی سیستم، لینوکس داده های زمانی مربوط به زمان دسترسی، زمان اصلاح و زمان تغییر را ذخیره می کند.

  • زمان دسترسی: آخرین باری که یک فایل خوانده یا نوشته شده است.
  • زمان اصلاح: آخرین باری که محتوای فایل اصلاح شد.
  • زمان تغییر: آخرین باری که ابرداده inode فایل تغییر کرد.

با استفاده از گزینه های atime- ،mtime- و -ctime، می توانید جستجوهای Find خود را بر اساس این پارامترها قرار دهید. برای هر یک از این گزینه ها، باید مقداری را ارسال کنید که نشان می دهد چند روز در گذشته می خواهید جستجو کنید. مشابه گزینه‌های اندازه که قبلاً توضیح داده شد، می‌توانید این گزینه‌ها را با علامت‌های مثبت یا منفی برای تعیین «بیشتر از» یا «کمتر از» قرار دهید.

به عنوان مثال، برای یافتن فایل‌هایی در پوشه /usr که در روز گذشته اصلاح شده‌اند، دستور زیر را اجرا کنید:

find /usr -mtime 1

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

find /usr -atime -1

برای یافتن فایل هایی که آخرین بار اطلاعات متا آنها بیش از 3 روز پیش تغییر کرده است، می توانید موارد زیر را اجرا کنید:

find /usr -ctime +3

این گزینه ها همچنین دارای پارامترهای همراهی هستند که می توانید از آنها برای تعیین دقیقه به جای روز استفاده کنید:

find /usr -mmin -1

با این کار فایل هایی که در آخرین لحظه اصلاح شده اند را نشان می دهد.

find همچنین می‌تواند با یک فایل مرجع مقایسه کند و موارد جدیدتر را برگرداند:

find / -newer reference_file

این نحو هر فایلی را در سیستم که اخیراً نسبت به فایل مرجع ایجاد یا تغییر کرده است، برمی گرداند.

یافتن توسط مالک و مجوزها

همچنین می‌توانید با استفاده از پارامترهای -user و -group فایل‌ها را توسط کاربر یا گروهی که مالک فایل هستند جستجو کنید. برای یافتن هر فایلی در پوشه /var که متعلق به کاربر syslog است این دستور را اجرا کنید:

find /var -user syslog

به طور مشابه، می‌توانید فایل‌ها را در فهرست /etc که متعلق به گروه shadow است با تایپ کردن:

find /etc -group shadow

همچنین می توانید فایل هایی با مجوزهای خاص را جستجو کنید.

اگر می‌خواهید مجموعه دقیقی از مجوزها را مطابقت دهید، می‌توانید از این نحو استفاده کنید که مجوزها را با استفاده از نماد هشت‌گانه مشخص می‌کند:

find / -perm 644

این فایل ها را دقیقاً با مجوزهای مشخص شده مطابقت می دهد.

اگر می‌خواهید چیزی را با حداقل این مجوزها مشخص کنید، می‌توانید قبل از نماد مجوزها با علامت منفی قرار دهید:

find / -perm -644

این با هر فایلی که مجوزهای اضافی دارند مطابقت دارد. یک فایل با مجوزهای 744 در این نمونه مطابقت دارد.

فیلتر کردن بر اساس عمق

در این بخش، یک نمونه ساختار دایرکتوری ایجاد می‌کنید که سپس از آن برای بررسی فیلتر کردن فایل‌ها بر اساس عمق آنها در ساختار استفاده می‌کنید. اگر مثال‌های این آموزش را دنبال می‌کنید، عاقلانه است که این فایل‌ها و دایرکتوری‌ها را در پوشه /tmp/ ایجاد کنید. /tmp/ یک دایرکتوری موقت است، به این معنی که هر فایل و دایرکتوری موجود در آن دفعه بعد که سرور بوت می شود حذف می شود. این برای اهداف این راهنما مفید خواهد بود، زیرا می‌توانید هر تعداد دایرکتوری، فایل و پیوندی که می‌خواهید ایجاد کنید، بدون اینکه نگران باشید که بعداً سیستم شما را مسدود می‌کند. پس از اجرای دستورات در این بخش، دایرکتوری /tmp/ شما حاوی سه سطح دایرکتوری است که در سطح اول ده دایرکتوری وجود دارد. هر دایرکتوری (شامل دایرکتوری موقت) شامل ده فایل و ده زیر شاخه خواهد بود.

با دستور زیر ساختار دایرکتوری نمونه را در پوشه /tmp/ ایجاد کنید:

mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}

پس از آن، این دایرکتوری ها را با چند فایل نمونه با استفاده از دستور لمسی پر کنید:

touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}

با در اختیار داشتن این فایل ها و دایرکتوری ها، پیش بروید و به دایرکتوری test/ که به تازگی ایجاد کرده اید بروید:

cd /tmp/test

برای درک پایه ای از نحوه بازیابی فایل ها از این ساختار، با جستجوی نام معمولی شروع کنید که با هر فایلی به نام file1 مطابقت دارد:

find -name file1
Output
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
./level1dir7/level2dir8/file1
. . .

این کار نتایج زیادی را به همراه خواهد داشت. اگر خروجی را به یک شمارنده لوله کنید، متوجه خواهید شد که در مجموع 1111 نتیجه وجود دارد:

find -name file1 | wc -l
Output
1111

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

find -maxdepth num -name query

برای یافتن file1 فقط در دایرکتوری های level1 و بالاتر، می توانید حداکثر عمق 2 را تعیین کنید (1 برای دایرکتوری سطح بالا و 1 برای دایرکتوری های level1):

find -maxdepth 2 -name file1
Output
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1

این یک لیست بسیار قابل مدیریت است.

همچنین اگر می‌دانید که همه فایل‌ها از یک نقطه خاص در زیر فهرست فعلی وجود دارند، می‌توانید یک فهرست حداقل مشخص کنید:

find -mindepth num -name query

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

find -mindepth 4 -name file1
Output
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .

باز هم، به دلیل ساختار شاخه شاخه، تعداد زیادی از نتایج (1000) را برمی گرداند.

می توانید پارامترهای حداقل و حداکثر عمق را برای تمرکز روی یک محدوده باریک ترکیب کنید:

find -mindepth 2 -maxdepth 3 -name file1
Output
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .

ترکیب این گزینه‌ها مانند این نتایج را به میزان قابل توجهی کاهش می‌دهد، و تنها ۱۱۰ خط به جای ۱۰۰۰ خط قبلی بازگردانده می‌شود.

اجرای دستورات در یافتن نتایج

می توانید با استفاده از پارامتر -exec با استفاده از دستور زیر، یک دستور کمکی دلخواه را روی هر چیزی که مطابقت پیدا می کند، اجرا کنید:

find find_parameters -exec command_and_options {} \;

{} به عنوان یک مکان نگهدار برای فایل هایی که مطابقت را پیدا می کنند استفاده می شود. \; اجازه می دهد تا بدانیم دستور به کجا ختم می شود.

به عنوان مثال، با فرض اینکه شما هنوز در دایرکتوری test/ که در مرحله قبل در پوشه /tmp/ ایجاد کرده اید هستید، می توانید فایل های قسمت قبل را که دارای 644 مجوز بودند پیدا کنید و آنها را طوری تغییر دهید که دارای 664 مجوز باشند:

find . -type f -perm 644 -exec chmod 664 {} \;

همچنین می توانید مجوزهای دایرکتوری را به روشی مشابه تغییر دهید:

find . -type d -perm 755 -exec chmod 700 {} \;

این مثال هر دایرکتوری با مجوزهای تنظیم شده روی 755 را پیدا می کند و سپس مجوزها را به 700 تغییر می دهد.

یافتن فایل ها با استفاده از Locate

جایگزینی برای استفاده از find دستور locate است. این دستور اغلب سریعتر است و می تواند کل سیستم فایل را به راحتی جستجو کند.

می توانید با به روز رسانی لیست بسته های خود و سپس نصب بسته molocate، دستور را در دبیان یا اوبونتو با apt نصب کنید:

sudo apt update
sudo apt install mlocate

در راکی لینوکس، CentOS و سایر توزیع‌های مشتق شده از RedHat، می‌توانید از دستور dnf برای نصب mlocate استفاده کنید:

sudo dnf install mlocate

دلیل اینکه مکان یابی سریعتر از یافتن است این است که به پایگاه داده ای متکی است که تمام فایل های موجود در سیستم فایل را فهرست می کند. این پایگاه داده معمولاً یک بار در روز با یک اسکریپت cron به روز می شود، اما می توانید آن را به صورت دستی با دستور updatedb به روز کنید. اکنون این دستور را با امتیازات sudo اجرا کنید:

sudo updatedb

به یاد داشته باشید، اگر می‌خواهید فایل‌های جدیدی پیدا کنید، پایگاه داده مکان‌یابی باید همیشه به‌روز باشد. اگر فایل های جدیدی را قبل از اجرای اسکریپت cron یا قبل از اجرای دستور updatedb اضافه کنید، در نتایج پرس و جو ظاهر نمی شوند.

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

locate query

این با هر فایل و دایرکتوری که شامل پرس و جو رشته ای در هر جایی از مسیر فایل آنها باشد مطابقت خواهد داشت. برای برگرداندن فقط فایل‌هایی که نام آنها شامل خود پرس و جو است، به جای هر فایلی که پرس و جو را در دایرکتوری‌های منتهی به آن دارد، می‌توانید پرچم -b را برای جستجوی تنها فایل‌هایی که «نام پایه» آنها با پرس و جو مطابقت دارد، اضافه کنید:

locate -b query

برای اینکه مکان‌یابی فقط نتایجی را که هنوز در سیستم فایل وجود دارند برمی‌گرداند (یعنی فایل‌هایی که بین آخرین تماس updatedb و تماس مکان فعلی حذف نشده‌اند)، از  -e استفاده کنید:

locate -e query

با استفاده از گزینه -S می توانید آمار مربوط به اطلاعاتی را که مکان فهرست شده است بازیابی کنید:

locate -S
Output
Database /var/lib/mlocate/mlocate.db:
21015 directories
136787 files
7727763 bytes in file names
3264413 bytes used to store database

این می تواند برای درک سطح بالایی از تعداد فایل ها و دایرکتوری های موجود در سیستم شما مفید باشد.

نتیجه

هر دو دستور find و locate ابزارهای مفیدی برای یافتن فایل ها در سیستم شما هستند. هر دو دستورات قدرتمندی هستند که می‌توان آن‌ها را با ترکیب آن‌ها با ابزارهای دیگر از طریق خطوط لوله تقویت کرد، اما این شما هستید که تصمیم می‌گیرید کدام ابزار برای موقعیت شما مناسب است. از اینجا، ما شما را تشویق می کنیم که به آزمایش یافتن و مکان یابی ادامه دهید. شما می توانید صفحات man مربوطه آنها را بخوانید تا در مورد گزینه های دیگری که در این راهنما به آنها پرداخته نشده است، بیاموزید و می توانید نتایج جستجو را با قرار دادن آنها در دستورات دیگری مانند wc، sort و grep تجزیه و تحلیل و دستکاری کنید.

[تعداد: 1   میانگین: 5/5]
دیدگاهتان را بنویسید

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

شاید دوست داشته باشید