أريد العثور على جميع الملفات التي تحتوي على سلسلة محددة من النص. ال 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
.
أعتقد أنه يمكنك استخدام شيء من هذا القبيل:
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/