كيفية استخدام" البقرى " الأمر للعثور على النص بما في ذلك الدلائل

أريد العثور على جميع الملفات التي تحتوي على سلسلة محددة من النص. ال grep يعمل الأمر ، لكنني لا أعرف كيفية استخدامه لكل دليل (يمكنني القيام بذلك فقط لدليلي الحالي). حاولت القراءة man grep، لكنها لم تسفر عن أي مساعدة.

سيكون من الأفضل استخدام

grep -rl "string" /path

أين

  • -r (أو --recursive) يستخدم الخيار لاجتياز أيضا جميع الدلائل الفرعية لل /path، بينما
  • -l (أو --files-with-matches) يستخدم الخيار لطباعة أسماء الملفات المطابقة فقط ، وليس الخطوط المطابقة (يمكن أن يؤدي ذلك أيضا إلى تحسين السرعة ، بالنظر إلى ذلك grep توقف عن قراءة ملف في المباراة الأولى مع هذا الخيار).

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

grep -Hrn 'search term' path/to/files
  • -H يتسبب في طباعة اسم الملف (ضمنيا عند البحث عن ملفات متعددة)
  • -r هل البحث العودية
  • -n يؤدي إلى طباعة رقم السطر

path/to/files يمكن أن يكون . للبحث في الدليل الحالي

مزيد من الخيارات التي أجدها مفيدة للغاية:

  • -I تجاهل الملفات الثنائية (تكملة: -a علاج جميع الملفات كنص)
  • -F علاج search term كما الحرفي ، وليس التعبير العادي
  • -i قم بإجراء بحث غير حساس لحالة الأحرف
  • --color=always لإجبار الألوان حتى عندما الأنابيب من خلال less. لجعل less دعم الألوان ، تحتاج إلى استخدام -r الخيار:

    grep -Hrn search . | less -r
  • --exclude-dir=dir مفيدة لاستبعاد الدلائل مثل .svn و .git.

Example output

أعتقد أنه يمكنك استخدام شيء من هذا القبيل:

find /path -type f -exec grep -l "string" {} \;

شرح من التعليقات

find هو أمر يتيح لك العثور على الملفات والكائنات الأخرى مثل الدلائل والروابط في الدلائل الفرعية لمسار معين. إذا لم تحدد قناعا يجب أن تفي به أسماء الملفات ، فإنه يعدد جميع كائنات الدليل.

  • -type f يحدد أنه يجب معالجة الملفات فقط ، وليس الدلائل وما إلى ذلك.
  • -exec grep يحدد أنه لكل ملف تم العثور عليه ، يجب تشغيل الأمر غريب ، ويمر اسم الملف الخاص به كوسيطة لذلك، عن طريق استبدال {} مع اسم الملف

أمري الافتراضي هو

grep -Rin string *

يمكنني استخدام الكابيتول ' ص ' لأن ls يستخدم ل العودية. منذ البقرى يقبل على حد سواء ، لا يوجد سبب لعدم استخدامه.

تحرير: لكل هفنسويتينغ ، على ما يبدو -R سوف تتبع الروابط الرمزية حيث -r لن.

إذا كنت على استعداد لتجربة شيء جديد ، فامنح ack لقطة. الأمر للبحث بشكل متكرر الدليل الحالي ل string هو:

ack string

التثبيت بسيط للغاية:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(بشرط أن يكون لديك الدليل بالفعل ~/bin ويفضل أن يكون في الخاص بك PATH.)

وتكرس القيادة رغريب لمثل هذه الحاجة

إذا لم يكن متاحا ، يمكنك الحصول عليه على النحو التالي

mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep

يمكنك تعيين مباشرة إلى خيارات البقرى الافتراضية الخاصة بك كما هو موضح أعلاه.

أنا شخصيا استخدام

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"

موضوع ذو صلة : كيفية استخدام رغريب دائما مع اللون

تحديث 2:

هذا الخط من الأوامر باستخدام find و grep إصلاح المشكلة:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> للإخراج الملون:

$ find path_to_search_in -type f \            -exec grep --color=always -in searchString {} 2>/dev/null +

مثال:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

مثال تشغيل في اللقطة أدناه:


تحديث 1:

يمكنك محاولة التعليمات البرمجية التالية ؛ كدالة في الخاص بك .bashrc أو .bash_aliases أو في برنامج نصي:

wherein () {     for i in $(find "$1" -type f 2> /dev/null);    do        if grep --color=auto -i "$2" "$i" 2> /dev/null; then            echo -e "\033[0;32mFound in: $i \033[0m\n";        fi;    done}

الاستخدام: wherein /path/to/search/in/ searchkeyword

مثال:

$ wherein ~/Documents/ "hello world"

(ملاحظة: كما هو مقترح في التعليقات أدناه من قبل إنزوتيب ، وهذا لا يعمل مع ملف/الدلائل بما في ذلك المسافات في أسمائهم.)


المشاركة الأصلية

للبحث عن السلسلة والإخراج فقط هذا الخط مع سلسلة البحث:

$ for i in $(find /path/of/target/directory -type f); do \    grep -i "the string to look for" "$i"; done

على سبيل المثال.:

$ for i in $(find /usr/share/applications -type f); \    do grep -i "web browser" "$i"; done

لعرض اسم الملف الذي يحتوي على سلسلة البحث:

$ for i in $(find /path/of/target/directory -type f); do \    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

على سبيل المثال.:

$ for i in $(find /usr/share/applications -type f); \    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \    fi; done;

grep (غنو أو بي إس دي)

يمكنك استخدام grep أداة للبحث بشكل متكرر المجلد الحالي مع -r المعلمة ، مثل:

grep -r "pattern" .

ملاحظة: -r - بشكل متكرر بحث الدلائل.

للبحث داخل ملفات محددة ، يمكنك استخدام بناء الجملة مثل:

grep "class foo" **/*.c

ملاحظة: باستخدام خيار الكرة الأرضية (**) ، يقوم بمسح جميع الملفات بشكل متكرر بامتداد أو نمط معين. لتمكين بناء الجملة هذا ، قم بتشغيل: shopt -s globstar. يمكنك أيضا استخدام **/*.* لجميع الملفات (باستثناء المخفية وبدون تمديد) أو أي نمط آخر.

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

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

بدلا من استخدام ripgrep.

ripgrep

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

rg "pattern" .

الخروج من المستندات ، خطوات التثبيت أو شفرة المصدر على صفحة مشروع جيثب.

انها أسرع بكثير من أي أداة أخرى مثل غنو/بي إس دي grep, ucg, ag, sift, ack, pt أو ما شابه ذلك ، لأنه مبني على رأس محرك ريجكس الصدأ والذي يستخدم الآلي محدود ، سيمد والتحسينات الحرفية العدوانية لجعل البحث سريع جدا.

وهو يدعم تجاهل الأنماط المحددة في .gitignore الملفات ، لذلك مسار ملف واحد يمكن أن تكون مطابقة ضد أنماط غلوب متعددة في وقت واحد.


يمكنك استخدام المعلمات الشائعة مثل:

  • -i - البحث غير حساس.
  • -I - تجاهل الملفات الثنائية.
  • -w - البحث عن كلمات كاملة (في مقابل مطابقة كلمة جزئية).
  • -n - عرض خط المباراة الخاصة بك.
  • -C/--context (على سبيل المثال. -C5)- يزيد السياق ، لذلك ترى التعليمات البرمجية المحيطة بها .
  • --color=auto - ضع علامة على النص المطابق.
  • -H - يعرض اسم الملف حيث تم العثور على النص.
  • -c - يعرض عدد من خطوط مطابقة. يمكن دمجها مع -H.

أفعل هذا باستخدام زارغس ، أمر الاستخفاف جدا

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

البحث ./ يعطيك قائمة متكررة من كافة الملفات في المجلد الحاليثم كنت الأنابيب إلى زارغس الذي ينفذ الأمر غريب على كل واحد من تلك الملفات

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

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

هذا يعمل لأن grep سيعود 0 إذا وجدت نتيجة لذلك ، 1 خلاف ذلك. على سبيل المثال يمكنك العثور على ملفات 1 ميغابايت كبيرة و تحتوي على شيء:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

لمتطلبات متعددة ربما كنت ترغب في استخدام العلم محسن -O هذا موجود في جنو غريب.

تشمل="*.ج "’ الخيار ، @المستخدم 311346 ، وذلك بفضل @ليكنستين.

البقرى-رين < تطعن نمط> * سيتم البحث من الدلائل الحالية لأسفل في جميع الملفات النصية.
لست متأكدا من كيفية إجراء بحثي بشكل متكرر في أنماط الملفات مثل *.ج مع البقرى فقط

استخدم تركيبة البحث والبقرى للبحث بشكل متكرر عن الملفات لسلسلة في الدلائل الفرعية الحالية وكافة الدلائل الفرعية. تحقق من هذا http://wilddiary.com/find-files-containing-my-text/