كيف يمكنني الإصابة بشكل متكرر؟

سئل على ١ يناير ٢٠١٠  ·  تمت مشاهدة 1.6M مرة  ·  مصدر

wpiri picture
في ١ يناير ٢٠١٠

كيف يمكنني بشكل متكرر grep جميع الدلائل والأدلة الفرعية؟

find . | xargs grep "texthere" *

الإجابات

Vinko Vrsalovic picture
في ١ يناير ٢٠١٠
2619
grep -r "texthere" .

يمثل المعامل الأول التعبير العادي المراد البحث عنه ، بينما يمثل المعامل الثاني الدليل الذي يجب البحث عنه. في هذه الحالة ، يعني . الدليل الحالي.

ملاحظة: هذا يعمل مع GNU grep ، وفي بعض الأنظمة الأساسية مثل Solaris ، يجب أن تستخدم GNU grep على وجه التحديد بدلاً من التنفيذ القديم. بالنسبة إلى Solaris ، هذا هو الأمر ggrep .

christangrant picture
في ٣٠ ديسمبر ٢٠١١
703

إذا كنت تعرف امتداد الملف أو نمطه الذي تريده ، فهناك طريقة أخرى وهي استخدام الخيار --include :

grep -r --include "*.txt" texthere .

يمكنك أيضًا ذكر الملفات المطلوب استبعادها باستخدام --exclude .

اي جي

إذا كنت تبحث كثيرًا عن الكود ، فإن Ag (The Silver Searcher) هو بديل أسرع بكثير لـ grep ، وهو مخصص للبحث عن الكود. على سبيل المثال ، إنه متكرر بشكل افتراضي ويتجاهل تلقائيًا الملفات والمجلدات المدرجة في .gitignore ، لذلك ليس عليك الاستمرار في تمرير نفس خيارات الاستبعاد المرهقة إلى grep أو البحث.

Kurt picture
في ١ يناير ٢٠١٠
130

أيضا:

find ./ -type f -print0 | xargs -0 grep "foo"

لكن grep -r هو إجابة أفضل.

VonC picture
في ١٤ فبراير ٢٠١٣
123

أستخدم الآن دائمًا (حتى على Windows مع GoW - Gnu على Windows ):

grep --include="*.xxx" -nRHI "my Text to grep" *

يتضمن الخيارات التالية:

--include=PATTERN

تكرار في الدلائل البحث عن ملف يطابق PATTERN .

-n, --line-number

بادئة كل سطر من الإخراج برقم السطر داخل ملف الإدخال الخاص به.

(ملاحظة: يضيف phuclv في التعليقات أن -n يقلل من الأداء كثيرًا ، لذلك قد ترغب في تخطي هذا الخيار)

-R, -r, --recursive

قراءة جميع الملفات الموجودة تحت كل دليل بشكل متكرر ؛ هذا يعادل الخيار -d recurse .

-H, --with-filename

اطبع اسم الملف لكل مباراة.

-I     

معالجة ملف ثنائي كما لو أنه لا يحتوي على بيانات مطابقة ؛
هذا يعادل الخيار --binary-files=without-match .

ويمكنني إضافة " i " ( -nRHIi ) ، إذا كنت أريد نتائج غير حساسة لحالة الأحرف.

أستطيع الحصول على:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...
rook picture
في ٨ أغسطس ٢٠١٣
25

في أنظمة POSIX ، لا تجد معلمة -r لـ grep grep -rn "stuff" . ولن يتم تشغيل find ، فسيتم:

find . -type f -exec grep -n "stuff" {} \; -print

موافق عليه بـ Solaris و HP-UX .

kenorb picture
في ١١ أبريل ٢٠١٨
20

globbing **

استخدام grep -r يعمل ، لكنه قد يكون مبالغة ، خاصة في المجلدات الكبيرة.

لمزيد من الاستخدام العملي ، إليك الصيغة التي تستخدم صيغة globbing ( ** ):

grep "texthere" **/*.txt

الذي يلتقط ملفات محددة فقط بنمط محدد. إنه يعمل مع الأصداف المدعومة مثل Bash +4 أو zsh .

لتنشيط هذه الميزة ، قم بتشغيل: shopt -s globstar .

راجع أيضًا: كيف يمكنني العثور على جميع الملفات التي تحتوي على نص معين على Linux؟

git grep

للمشاريع تحت التحكم في إصدار Git ، استخدم:

git grep "pattern"

وهو أسرع بكثير.

ripgrep

بالنسبة للمشاريع الأكبر حجمًا ، فإن أسرع أداة تجريب هي ripgrep والتي تقوم بتجميع الملفات بشكل متكرر افتراضيًا:

rg "pattern" .

إنه مبني على قمة محرك Rust's regex الذي يستخدم أوتوماتيكية محدودة ، SIMD وتحسينات حرفية قوية لجعل البحث سريعًا للغاية. تحقق من التحليل التفصيلي هنا .

chim picture
في ٣ ديسمبر ٢٠١٢
11

يمكن أن تكون أسماء الملفات فقط مفيدة أيضًا

grep -r -l "foo" .
Girdhar Singh Rathore picture
في ٢٩ يناير ٢٠١٦
11

للعثور على اسم files مع path بشكل متكرر يحتوي على الأمر المعين string المستخدم أدناه لـ UNIX :

find . | xargs grep "searched-string"

مقابل Linux :

grep -r "searched-string" .

ابحث عن ملف على خادم UNIX

find . -type f -name file_name

ابحث عن ملف على خادم LINUX

find . -name file_name
SarcasticSully picture
في ٣ أغسطس ٢٠١٦
10

إذا كنت تريد فقط اتباع الدلائل الفعلية ، وليس الروابط الرمزية ،

grep -r "thingToBeFound" directory

إذا كنت ترغب في متابعة الروابط الرمزية بالإضافة إلى الدلائل الفعلية (كن حذرًا من التكرار اللانهائي) ،

grep -R "thing to be found" directory

نظرًا لأنك تحاول grep بشكل متكرر ، فقد تكون الخيارات التالية مفيدة لك أيضًا:

-H: outputs the filename with the line

-n: outputs the line number in the file

لذلك إذا كنت تريد العثور على جميع الملفات التي تحتوي على Darth Vader في الدليل الحالي أو أي أدلة فرعية والتقاط اسم الملف ورقم السطر ، ولكن لا تريد أن تتبع العودية روابط رمزية ، فسيكون الأمر

grep -rnH "Darth Vader" .

إذا كنت تريد العثور على جميع الإشارات إلى كلمة قطة في الدليل

/home/adam/Desktop/TomAndJerry 

وأنت حاليًا في الدليل

/home/adam/Desktop/WorldDominationPlot

وتريد التقاط اسم الملف وليس رقم السطر لأي مثيل من السلسلة "cats" ، وتريد أن تتبع العودية الروابط الرمزية إذا عثرت عليها ، يمكنك تشغيل أي مما يلي

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

مصدر:

تشغيل "grep --help"

مقدمة قصيرة للروابط الرمزية ، لأي شخص يقرأ هذه الإجابة ويحتار من إشاري إليها: https://www.nixtutor.com/freebsd/understanding-symbolic-links/

dranxo picture
في ٢٢ مايو ٢٠١٤
8

ag هي الطريقة المفضلة للقيام بذلك الآن github.com/ggreer/the_silver_searcher . إنه في الأساس نفس الشيء مثل ack ولكن مع بعض التحسينات الأخرى.

هنا معيار قصير. أقوم بمسح ذاكرة التخزين المؤقت قبل كل اختبار (راجع https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s