من سعی دارم روشی را برای جستجوی تمام سیستم لینوکس برای پیدا کردن تمام فایل هایی که یک متن خاص دارند، پیدا کنم. منظورم متنی در نام فایل ها نیست بلکه در خود فایل هاست.
زمانی که به دنبال انجام این کار بودم، دوبار با این راهکار روبرو شدم
find / -type f -exec grep -H 'text-to-find-here' {} ;
با این حال، کار نمیکنه. به نظر میرسه این دستور تک تک فایل ها در سیستم را نشان می دهد.
آیا این روش به کاری که می خواهم انجام بدم نزدیک هست؟ اگر نه چطور باید این کار رو انجام بدم؟ این که بتوان یک رشته متنی رو در فایل ها جستجو کرد به شدت برای پروژه های برنامه نویسی کاربردی هست.
برای این پرسش 4 پاسخ وجود دارد
4به این شکل عمل کن:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
یا -R
بازگشتی هست,-n
شماره خط, و-w
برای تطابق کل کلمه هست.-l
(lower-case L) به این منظور هست که فقط نام فایل نمایش داده بشه.جدای از این ها پرچم های --exclude
, --include
, --exclude-dir
برای جستجوی بهینه تر قابل استفاده هستند:
به این شکل فقط فایل هایی که دارای پسوند .h یا .c هستند جستجو می شوند:
grep --include=*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
به این شکل فقط فایل های جستجو میشه که آخر پسوند فایل با o به پایان برسه:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
--exclude-dir
وجود داره. برای نمونه، به شکل زیر از مسیر های dir1/, dir2/ و تمام مسیر هایی که مطابق *.dst هستند، چشم پوشی میشه:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
این راهکار برای من به خوبی کار میکنه و درست چیزی که میخوای رو میتونم به همین روش بدست بیاورم.
برای گزینه های بیشتر man grep
رو بررسی کن.
امتیاز9264👍
میتونی از grep -ilR
استفاده کنی:
grep -Ril "text-to-find-here" /
i
برای چشم پوشی از بزرگ و کوچیکی حروف هست.R
به منظور بازگشتی بودن جستجو هست.l
به معنی این هست که نام فایل رو به جای خود نتیجه نشون بده"./
به معنای شروع از root سیستم هست.امتیاز1456👍
میتونی از ack استفاده کنی. مثل grep برای سورس کد هست. میتونی برای جستجوی کل فایل سیستم از اون استفاده کنی:
فقط کافیه:
ack 'text-to-find-here'
رو در مسیر root اجرا کنی.
همچنین میتونی از regular expressions برای پیدا کردن یک نوع از فایل و... استفاده کنی.
برورسانی
من به تازگی The Silver Searcher رو پیدا کردم که مثل ack هست اما 3 تا 5 برابر از اون سریع تره و حتی از الگو های فایل .gitignore
هم چشم پوشی میکنه.
امتیاز320👍