it-swarm.asia

كيف يمكنني grep بشكل متكرر؟

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

find . | xargs grep "texthere" *
1532
wpiri
grep -r "texthere" .

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

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

2304
Vinko Vrsalovic

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

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

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

اي جي

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

623
christangrant

أيضا:

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

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

120
Kurt

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

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

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

--include=PATTERN

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

-n, --line-number

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

(ملاحظة: phuclv add في التعليقات that -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;
...
107
VonC

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

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

تمت الموافقة عليه بواسطة Solaris و HP-UX.

21
rook

التذمر **

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

للاستخدام العملي أكثر ، إليك الصيغة التي تستخدم globbing بناء الجملة (**):

grep "texthere" **/*.txt

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

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

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

git grep

بالنسبة للمشروعات الخاضعة للتحكم في إصدار Git ، استخدم:

git grep "pattern"

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

ripgrepNAME_

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

rg "pattern" .

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

16
kenorb

للعثور على اسم 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
11
Girdhar Singh Rathore

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

grep -r -l "foo" .
10
chim

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

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

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

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

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

مصدر:

تشغيل "grep - مساعدة"

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

9
SarcasticSully

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

وهنا معيار قصير. أقوم بمسح ذاكرة التخزين المؤقت قبل كل اختبار (cf 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
8
dranxo

هذا هو الذي عمل لحالتي على الجهاز الحالي (git bash على نظام التشغيل windows 7):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

أنا دائما أنسى -print0 و -0 للمسارات مع المسافات.

تحرير: أداتي المفضلة هي الآن ripgrep: https://github.com/BurntSushi/ripgrep/releases . إنه سريع حقًا ولديه افتراضيات أفضل (مثل العودية افتراضيًا). نفس مثال إجابتي الأصلية ولكن باستخدام ripgrep: rg -g "*.cs" "content pattern"

6
arkod

إذا كنت تبحث عن محتوى معين في جميع الملفات من بنية الدليل ، فيمكنك استخدام find لأنه من الواضح أكثر ما تفعله:

find -type f -exec grep -l "texthere" {} +

لاحظ أن -l (حرف صغير من L) يعرض اسم الملف الذي يحتوي على النص. قم بإزالته إذا كنت تريد بدلاً من ذلك طباعة المباراة نفسها. أو استخدم -H للحصول على الملف مع المطابقة. معًا ، هناك بدائل أخرى:

find -type f -exec grep -Hn "texthere" {} +

حيث -n يطبع رقم السطر.

6
fedorqui

هذا يجب أن يعمل:

grep -R "texthere" *
5
sumit kumar

grep -r "texthere" .((فترة الإشعار في النهاية)

(^ credit: https://stackoverflow.com/a/1987928/1438029 )


توضيح:

grep -r "texthere" / (بشكل متكرر grep الكل الدلائل والدلائل)

grep -r "texthere" . (بشكل متكرر grep هذه الدلائل والدلائل)

grep العودية

grep [options] PATTERN [FILE...]

[خيارات]

-R, -r, --recursive

قراءة جميع الملفات تحت كل دليل ، بشكل متكرر.

هذا يكافئ خيار -d recurse أو --directories=recurse.

http://linuxcommand.org/man_pages/grep1.html

مساعدة grep

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

البدائل

ack ( http://beyondgrep.com/ )

ag ( http://github.com/ggreer/the_silver_searcher )

4
Geoffrey Hale

في خادم IBM AIX (إصدار نظام التشغيل: AIX 5.2) ، استخدم:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

سيؤدي ذلك إلى طباعة اسم المسار/الملف ورقم السطر النسبي في الملف مثل:

./inc/xxxx_x.h

2865:/** الوصف: stringYouWannaFind * /

على أي حال ، فإنه يعمل بالنسبة لي:)

3
user3606336

فيما يلي أمر البحث في String بشكل متكرر على بيئة Unix و Linux.

بالنسبة للأمر UNIX:

find . -name "string to be searched" -exec grep "text" "{}" \;

بالنسبة للأمر Linux:

grep -r "string to be searched" .
3
Girdhar Singh Rathore

أعتقد أن هذا هو ما تحاول الكتابة

grep myText $(find .)

وقد يكون هذا شيئًا آخر مفيدًا إذا كنت تريد العثور على ملفات grep التي تم الوصول إليها

grep myText $(find .) | cut -d : -f 1 | sort | uniq
2
Victor Faria

في 2018 ، تريد استخدام ripgrep أو the-silver-searcher لأنها أسرع بكثير من البدائل.

فيما يلي دليل يحتوي على 336 دليل فرعي من المستوى الأول:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

على OSX ، يقوم هذا بتثبيت ripgrep: brew install ripgrep. هذا يثبت silver-searcher: brew install the_silver_searcher.

2
hughdbrown

للحصول على قائمة بالأعلام المتاحة:

grep --help 

إرجاع كل التطابقات الخاصة بـ regexp texthere في الدليل الحالي ، مع رقم السطر المقابل:

grep -rn "texthere" .

إرجاع جميع التطابقات لـ texthere ، بدءًا من الدليل الجذر ، برقم السطر المقابل وحالة التجاهل:

grep -rni "texthere" /

الأعلام المستخدمة هنا:

  • -r العودية
  • -n رقم سطر الطباعة مع الإخراج
  • -i تجاهل الحالة
2
JSON C11

لاحظ أن find . -type f | xargs grep whatever أنواع الحلول سوف تعمل على أخطاء "قائمة وسيطة إلى طويلة" عندما يكون هناك الكثير من الملفات المتطابقة مع البحث.

أفضل رهان هو grep -r ولكن إذا لم يكن ذلك متاحًا ، فاستخدم find . -type f -exec grep -H whatever {} \; بدلاً من ذلك.

1
m.thome

للمتعة فقط ، ابحث بسرعة وقذرة عن ملفات * .txt إذا كانت إجابةchristangrant كثيرة جدًا للكتابة :-)

grep -r texthere .|grep .txt

1
PJ Brunet

في ما يلي دالة عودية (تم اختبارها باستخفاف باستخدام bash و sh) والتي تعبر جميع المجلدات الفرعية لمجلد محدد ($ 1) وتستخدم grep عمليات البحث عن السلسلة المعينة ($ 3) في ملفات معيّنة ($ 2):

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

تشغيله ومثال الإخراج:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
0
James Brown