أحاول إيجاد طريقة لفحص نظام Linux بالكامل بحثًا عن جميع الملفات التي تحتوي على سلسلة نصية محددة. فقط للتوضيح ، أنا أبحث عن نص داخل الملف ، وليس في اسم الملف.
عندما كنت أبحث عن كيفية القيام بذلك ، صادفت هذا الحل مرتين:
find / -type f -exec grep -H 'text-to-find-here' {} \;
ومع ذلك ، لا يعمل. يبدو أن عرض كل ملف واحد في النظام.
هل هذا قريب من الطريقة الصحيحة للقيام بذلك؟ إذا لم يكن كذلك ، كيف ينبغي لي؟ ستكون هذه القدرة على العثور على سلاسل نصية في الملفات مفيدة للغاية لبعض مشاريع البرمجة التي أقوم بها.
قم بما يلي:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
أو -R
متكرر ،-n
هو رقم السطر و-w
تعني مطابقة الكلمة بالكامل.-l
(الأحرف الصغيرة L) لإعطاء اسم ملف الملفات المطابقة.إلى جانب هذه ، يمكن استخدام إشارات --exclude
و --include
و --exclude-dir
للبحث الفعال:
سيبحث هذا فقط من خلال الملفات التي لها امتدادات .c أو .h:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
سيستبعد هذا البحث في جميع الملفات التي تنتهي بامتداد .o:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
بالنسبة للأدلة ، يمكن استبعاد دليل (عناوين) معيّن من خلال المعلمة --exclude-dir
. على سبيل المثال ، سيؤدي هذا إلى استبعاد dir dir1/، dir2/وكلها مطابقة * .dst /:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
هذا يعمل بشكل جيد للغاية بالنسبة لي ، لتحقيق نفس الغرض تقريبا مثل لك.
لمزيد من الخيارات ، تحقق من man grep
.
يمكنك استخدام grep -ilR
:
grep -Ril "text-to-find-here" /
i
تعني حالة التجاهل (اختياري في حالتك).R
تعني العودية.l
تعني "إظهار اسم الملف ، وليس النتيجة نفسها"./
لتقف على البدء من جذر جهازك.يمكنك استخدام ack . يشبه grep لكود المصدر. يمكنك مسح نظام الملفات بأكمله به.
فقط افعل:
ack 'text-to-find-here'
في الدليل الجذر الخاص بك.
يمكنك أيضًا استخدام التعبيرات العادية ، تحديد نوع الملف ، إلخ.
UPDATE
لقد اكتشفت للتو The Silver Searcher ، الذي يشبه ack لكن أسرع من 3-5 مرات حتى أنه يتجاهل الأنماط من ملف .gitignore
.
يمكنك استخدام:
grep -r "string to be searched" /path/to/dir
r
تعني العودية ، لذا سوف تبحث في المسار المحدد وأيضًا الدلائل الفرعية الخاصة به. سيخبرك هذا باسم الملف بالإضافة إلى طباعة السطر في الملف حيث تظهر السلسلة.
أو أمر مشابه للأمر الذي تحاوله (مثال:) للبحث في جميع ملفات جافا سكريبت (* .js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
سيؤدي ذلك إلى طباعة الخطوط الموجودة في الملفات التي يظهر فيها النص ، لكنه لا يطبع اسم الملف.
بالإضافة إلى هذا الأمر ، يمكننا كتابة هذا أيضًا: grep -rn "سلسلة للبحث"/path/to/directory/أو/file -r: البحث المتكرر n: سيتم عرض رقم السطر للمطابقات
يمكنك استخدام هذا:
grep -inr "Text" folder/to/be/searched/
بادئ ذي بدء ، أعتقد أنك استخدمت -H
بدلاً من -l
. كما يمكنك محاولة إضافة النص داخل علامات اقتباس متبوعة بـ {} \
.
find / -type f -exec grep -l "text-to-find-here" {} \;
لنفترض أنك تبحث عن ملفات تحتوي على نص محدد "ترخيص Apache" داخل الدليل الخاص بك. سيعرض نتائج مشابهة إلى حد ما أدناه (الإخراج سيكون مختلفًا استنادًا إلى محتوى الدليل الخاص بك).
bash-4.1$ find . -type f -exec grep -l "Apache License" {} \;
./net/Java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$
حتى إذا لم تكن تستخدم الحالة مثل "text" vs "TEXT" ، يمكنك استخدام رمز التبديل -i
لتجاهل الحالة. يمكنك قراءة المزيد من التفاصيل هنا .
آمل أن يساعدك هذا.
إذا كان لديك grep
لا يدعم البحث المتكرر ، فيمكنك الجمع بين find
مع xargs
:
find / -type f | xargs grep 'text-to-find-here'
أجد هذا أسهل في التذكر من تنسيق find -exec
.
سيؤدي ذلك إلى إخراج اسم الملف ومحتوى السطر المطابق ، على سبيل المثال.
/home/rob/file:text-to-find-here
علامات اختيارية قد ترغب في إضافتها إلى grep
:
-i
- حالة البحث غير الحساسة-l
- قم بإخراج اسم الملف فقط حيث تم العثور على التطابق-h
- فقط إخراج السطر المتطابق (وليس اسم الملف)grep
( GNU أو BSD )يمكنك استخدام أداة grep
للبحث بشكل متكرر في المجلد الحالي ، مثل:
grep -r "class foo" .
ملاحظة: -r
- البحث بشكل متكرر الدلائل الفرعية.
يمكنك أيضًا استخدام بناء جملة globbing للبحث ضمن ملفات محددة مثل:
grep "class foo" **/*.c
ملاحظة: باستخدام خيار التزحلق (**
) ، يقوم بمسح جميع الملفات بشكل متكرر باستخدام ملحق أو نقش معين. لتمكين بناء الجملة هذا ، قم بتشغيل: shopt -s globstar
. يمكنك أيضًا استخدام **/*.*
لجميع الملفات (باستثناء الملفات المخفية ودون امتداد) أو أي نمط آخر.
إذا كان لديك خطأ في أن الوسيطة طويلة جدًا ، ففكر في تضييق نطاق البحث ، أو استخدم بناء جملة find
بدلاً من ذلك مثل:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
بدلاً من ذلك استخدم ripgrep
.
إذا كنت تعمل على مشاريع أكبر أو ملفات كبيرة ، فعليك استخدام ripgrep
بدلاً من ذلك ، مثل:
rg "class foo" .
راجع مستندات أو خطوات التثبيت أو التعليمات البرمجية المصدر في صفحة مشروع GitHub /.
إنها أسرع بكثير من أي أداة أخرى مثل/- _ gnu _ / BSDripgrep
، grep
، ucg
، ag
، sift
، ack
، pt
أو ما شابه ذلك ، نظرًا لأنه مبني على أعلى محرك Regex من Rust والذي يستخدم عمليات الأتمتة المحدودة ، SIMD والتحسينات الحرفية القوية لجعل البحث سريعًا جدًا.
وهو يدعم تجاهل الأنماط المحددة في ملفات .gitignore
، لذلك يمكن مطابقة مسار ملف واحد مع أنماط متعددة للجلد في وقت واحد.
يمكنك استخدام المعلمات الشائعة مثل:
-i
- البحث غير الحساسة.-I
- تجاهل الملفات الثنائية.-w
- ابحث عن الكلمات بأكملها (على عكس مطابقة الكلمات الجزئية).-n
- عرض خط المباراة الخاص بك.-C
/--context
(على سبيل المثال -C5
) - يزيد السياق ، حتى ترى الشفرة المحيطة.--color=auto
- تمييز النص المطابق.-H
- يعرض اسم الملف حيث تم العثور على النص.-c
- يعرض عدد خطوط المطابقة. يمكن دمجه مع -H
.grep -insr "pattern" *
i
: تجاهل اختلافات الحالة في كل من PATTERN وملفات الإدخال.n
: بادئة كل سطر من الإخراج برقم السطر القائم على 1 داخل ملف الإدخال الخاص به.s
: منع رسائل الخطأ حول الملفات غير الموجودة أو غير القابلة للقراءة.r
: قراءة جميع الملفات تحت كل دليل ، بشكل متكرر.محاولة:
find . -name "*.txt" | xargs grep -i "text_pattern"
كيف يمكنني العثور على جميع الملفات التي تحتوي على نص معين على Linux؟ (...)
صادفت هذا الحل مرتين:
find / -type f -exec grep -H 'text-to-find-here' {} \;
إذا كان استخدامfindمثل في مثالك ، فمن الأفضل إضافة -s
(--no-messages
) إلى grep
و 2>/dev/null
في نهاية الأمر لتجنب الكثير من تم رفض الإذنgrep
و find
:
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
findهي الأداة القياسية للبحث عن الملفات - مقترنة بـ grep عند البحث عن نص معين - على الأنظمة الأساسية المشابهة لـ Unix. غالبًا ما يتم دمج الأمر find مع xargs ، بالمناسبة.
توجد أدوات أسرع وأسهل لنفس الغرض - انظر أدناه. جربهم بشكل أفضل ، {بشرط أن يكونوا متاحين على النظام الأساسي الخاص بك ، بالطبع:
RipGrep- أسرع أداة بحث حول:
rg 'text-to-find-here' / -l
ag 'text-to-find-here' / -l
ack:
ack 'text-to-find-here' / -l
ملاحظة: يمكنك إضافة 2>/dev/null
إلى هذه الأوامر أيضًا ، لإخفاء العديد من رسائل الخطأ.
تحذير : ما لم تكن قادرًا على تجنبه ، لا تبحث من '/' (الدليل الجذر) لتجنب بحث طويل وغير فعال في الأمثلة أعلاه ، من الأفضل أن تستبدل '/' باسم دليل فرعي ، على سبيل المثال "/ home" حسب المكان الذي تريد البحث فيه ...
هناك أداة مساعدة جديدة تسمى The Silversearcher
Sudo apt install silversearcher-ag
وهي تعمل عن كثب مع Git و VCS الأخرى. لذلك لن تحصل على أي شيء في .git أو دليل آخر.
يمكنك ببساطة استخدام
ag -ia "Search query"
وسوف تفعل المهمة لك!
استخدم pwd
للبحث من أي دليل تتواجد فيه ، متكررًا نحو الأسفل
grep -rnw `pwd` -e "pattern"
تحديث اعتمادًا على إصدار grep الذي تستخدمه ، يمكنك حذف pwd
. في الإصدارات الأحدث .
، يبدو أنها الحالة الافتراضية لـ grep إذا لم يتم تقديم دليل بذلك:
grep -rnw -e "pattern"
أو
grep -rnw "pattern"
سوف تفعل الشيء نفسه على النحو الوارد أعلاه!
grep
يمكن استخدامها حتى لو لم نبحث عن سلسلة.
ببساطة الجري ،
grep -RIl "" .
سيتم طباعة المسار إلى جميع الملفات النصية ، أي تلك التي تحتوي على أحرف قابلة للطباعة فقط.
فيما يلي قائمة بالأوامر العديدة التي يمكن استخدامها للبحث في الملفات.
grep "text string to search” directory-path
grep [option] "text string to search” directory-path
grep -r "text string to search” directory-path
grep -r -H "text string to search” directory-path
egrep -R "Word-1|Word-2” directory-path
egrep -w -R "Word-1|Word-2” directory-path
find
بسيطة يمكن أن تعمل في متناول يدي. الاسم المستعار في ملف ~/.bashrc
الخاص بك:
alias ffind find / -type f | xargs grep
بدء محطة جديدة وإصدار:
ffind 'text-to-find-here'
find /path -type f -exec grep -l "string" {} \;
شرح من التعليقات
find هو أمر يتيح لك العثور على الملفات والكائنات الأخرى مثل الدلائل والروابط في الدلائل الفرعية لمسار معين. إذا لم تحدد قناعًا يجب أن تفي به أسماء الملفات ، فسيعدد كل كائنات الدليل.
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
آمل أن يكون هذا هو المساعدة ...
توسيع grep
قليلاً لإعطاء مزيد من المعلومات في الإخراج ، على سبيل المثال ، للحصول على رقم السطر في الملف حيث يمكن تنفيذ النص على النحو التالي:
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
وإذا كانت لديك فكرة عن نوع الملف ، فيمكنك تضييق نطاق البحث عن طريق تحديد امتدادات أنواع الملفات للبحث عنها ، في هذه الحالة .pas
OR .dfm
files:
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
شرح قصير للخيارات:
.
في find
تحدد من الدليل الحالي.-name
"*.*
": لجميع الملفات (-اسم "*.pas
" -o -name "*.dfm
"): فقط *.pas
"OR *.dfm
الملفات فقط ، OR] _ المحددة مع -o
-type f
أنك تبحث عن الملفات-print0
و --null
على الجانب الآخر من |
(توجيه الإخراج) من الأمور الحاسمة ، ويمر اسم الملف من find
إلى grep
مضمن في xargs
، مما يسمح بمرور أسماء الملفات WITH مسافات في أسماء الملفات ، مما يسمح بمرور أسماء الملفات WITH مسافات في أسماء الملفات. واسم الملف كسلسلة واحدة ، وليس تقسيمها على كل مساحة.Silver Searcher أداة رائعة ، لكن ripgrep قد يكون أفضل.
إنه يعمل على أنظمة Linux و Mac و Windows ، وتم كتابته على Hacker News قبل شهرين (يحتوي هذا على رابط إلى مدونة Andrew Gallant's التي تحتوي على رابط GitHub):
محاولة:
find / -type f -exec grep -H 'text-to-find-here' {} \;
التي ستبحث جميع أنظمة الملفات ، لأن /
هو المجلد الجذر.
لاستخدام المجلد الرئيسي:
find ~/ -type f -exec grep -H 'text-to-find-here' {} \;
لاستخدام المجلد الحالي:
find ./ -type f -exec grep -H 'text-to-find-here' {} \;
كتبت بيثون النصي الذي يفعل شيئا مماثلا. هذه هي الطريقة التي ينبغي للمرء استخدام هذا البرنامج النصي.
./sniff.py path pattern_to_search [file_pattern]
الوسيطة الأولى ، path
، هي الدليل الذي سنبحث فيه بشكل متكرر. الوسيطة الثانية ، pattern_to_search
، هي تعبير عادي نريد البحث فيه في ملف. نحن نستخدم تنسيق التعبير المعتاد المحدد في مكتبة Pythonre
. في هذا البرنامج النصي ، يتطابق الرمز .
أيضًا مع السطر الجديد.
الوسيطة الثالثة ، file_pattern
، اختيارية. هذا هو تعبير منتظم آخر يعمل على اسم ملف. سيتم النظر فقط في تلك الملفات التي تطابق هذا التعبير العادي.
على سبيل المثال ، إذا أردت البحث في ملفات Python بالملحق py
الذي يحتوي على Pool(
متبوعًا بـ Word Adaptor
، فأفعل ما يلي ،
./sniff.py . "Pool(.*?Adaptor" .*py
./Demos/snippets/cubeMeshSigNeur.py:146
./Demos/snippets/testSigNeur.py:259
./python/moose/multiscale/core/mumbl.py:206
./Demos/snippets/multiComptSigNeur.py:268
وفويلا ، يقوم بإنشاء مسار الملفات المطابقة ورقم السطر الذي تم العثور على المطابقة فيه. إذا تم العثور على أكثر من تطابق ، فسيتم إلحاق كل رقم سطر في اسم الملف.
استعمال:
grep -c Your_Pattern *
سيقوم هذا بالإبلاغ عن عدد نسخ النموذج الموجودة لديك في كل ملف من الملفات الموجودة في الدليل الحالي.
grep هو صديقك الحميم لتحقيق ذلك.
grep -r <text_fo_find> <directory>
إذا كنت لا تهتم لحالة النص للعثور ثم استخدام
grep -ir <text_to_find> <directory>
جميع الإجابات السابقة تشير إلى grep والعثور عليها. ولكن هناك طريقة أخرى: استخدام قائد منتصف الليل
إنها أداة مساعدة مجانية (عمرها 30 عامًا ، تم إثباتها بمرور الوقت) وهي مرئية دون أن تكون واجهة المستخدم الرسومية. لديها الكثير من الوظائف ، وإيجاد الملفات هو واحد منهم فقط.
للبحث عن السلسلة وإخراج ذلك السطر بسلسلة البحث فقط:
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;
هناك أداة ack
يمكنها أن تفعل بالضبط ما تبحث عنه.
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
قد تتجاهل -i
للبحث عن حالة حساسة
سوف يعمل الأمر أدناه جيدًا لهذا النهج:
find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
جرب هذا:
find . | xargs grep 'Word' -sl
أنا مفتون بمدى السهولة التي يجعلها grep مع 'rl'
grep -rl 'pattern_to_find' /path/where/to/find
-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'
استخدم "-r" بدون "l" لرؤية أسماء الملفات متبوعة بـ نص تم العثور على النموذج !
grep -r 'pattern_to_find' /path/where/to/find
يعمل الكمال فقط ..
آمل أن يساعد!
يمكنك استخدام الأمر أدناه لأنك لا تريد اسم الملف ولكنك تريد البحث من جميع الملفات. إليكم التقاط نموذج "نص" جميع ملفات السجل مع التأكد من عدم طباعة اسم الملف
grep -e TEXT *.log | cut -d' ' --complement -s -f1
يعد خيار grep with -e سريعًا جدًا مقارنة بالخيار الآخر كما هو الحال في مطابقة PATTERN
تجنب المتاعب وتثبيت ack-grep. أنه يلغي الكثير من الإذن ومشاكل الاقتباس.
apt-get install ack-grep
ثم انتقل إلى الدليل الذي تريد البحث عنه وتشغيل الأمر أدناه
cd /
ack-grep "find my keyword"
يُفضل find
مع xarg
s عندما يكون هناك العديد من التطابقات المحتملة للتصفح. يعمل ببطء أكثر من الخيارات الأخرى ، لكنه يعمل دائمًا. كما اكتشف البعض ، xargs
لا يتعامل مع الملفات ذات المساحات المدمجة بشكل افتراضي. يمكنك التغلب على هذا عن طريق تحديد الخيار -d
.
فيما يلي إجابة @ RobEarl ، محسّنة بحيث تتعامل مع الملفات ذات المسافات:
find / -type f | xargs -d '\n' grep 'text-to-find-here'
فيما يلي إجابة venkat @ ، والتي تم تحسينها بالمثل:
find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"
في ما يلي إجابةGert van Biljon ، تم تعزيزها بالمثل:
find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
هنا إجابة @ LetalProgrammer ، المحسنة بالمثل:
alias ffind find / -type f | xargs -d '\n' grep
في ما يلي إجابة Tayab Hussain ، تم تحسينها بالمثل:
find . | xargs -d '\n' grep 'Word' -sl
إذا كان لديك مجموعة من الملفات التي ستقوم بالتحقق منها دائمًا ، فيمكنك الاسم المستعار لمساراتها ، على سبيل المثال:
alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'
ثم يمكنك ببساطة تصفية القائمة مثل هذا:
grep -U -l $'\015' $(fd)
الذي تصفية القائمة fd إلى الملفات التي تحتوي على نمط CR.
أجد أن التعرجات في الملفات التي أهتم بها تساعدني في إنشاء نصوص أسهل ، ثم أحاول دائمًا تذكر كيفية الحصول على كل هذه الملفات. تعمل الأشياء العودية أيضًا ولكن عاجلاً أم آجلاً ، سيتعين عليك التعامل مع أنواع الملفات المحددة. وهذا هو السبب في أنني فقط أجد كل أنواع الملفات التي أرغب في البدء بها.
إذا كنت تريد استخدام find
بصرامة ، فقم بما يلي:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
find + grep
1. استخدام find
للبحث في الملفات ، 2. ثم تنفيذ grep
عليها جميعًا.
يمكن دمجها في أمر واحد على النحو التالي:
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
استخدم -name Pattern
إذا كنت تريد grep
فقط بعض الملفات:
find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
هذا يمكن أن يوفر لك قوة find
للعثور على الملفات. يمكنك اللعب معها واستخدام خيارات مختلفة من find
لتحسين البحث عن الملفات أو تضييقه.
جرب هذا:
find / -type f -name "*" -exec grep -il "String_to_search" {} \;
أو
for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
استعمال:
grep -Erni + "text you wanna search"
سيبحث الأمر بشكل متكرر في جميع الملفات والدلائل الموجودة في الدليل الحالي ويطبع النتيجة.
ملاحظة: إذا لم يكن ناتج grep ملونًا ، فيمكنك تغييره باستخدام الاسم المستعار grep = 'grep --color = دائمًا' في ملف مصدر Shell.
يمكنك استخدام الأوامر التالية للعثور على نص معين من ملف:
cat file | grep 'abc' | cut -d':' -f2
كما بيتر في الإجابة السابقة المذكورة ، كل الإجابات السابقة تشير إلى grep والعثور عليها.
ولكن هناك طريقة أكثر تطوراً في استخدام Gnome Commander مع_ واجهة المستخدم الرسوميةمع وجود الكثير من الخيارات منذ عام 2001 ، وإيجاد الملفات هو واحد منهم فقط. إنها أداة مجانية أيضًا ، أثبتت بمرور الوقت.
جرب هذا
find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
GUI Search Alternative - لاستخدام سطح المكتب:
- لأن السؤال لا يطالب بالتحديد بالأوامر
Searchmonkey : أداة متقدمة للبحث عن الملفات دون الحاجة إلى فهرسة النظام الخاص بك باستخدام التعبيرات العادية. مكافئ رسومي لإيجاد/grep. متاح لنظام التشغيل Linux (Gnome/KDE/Java) و Windows (Java) - المصدر المفتوح GPL v3
الميزات:
تنزيل - روابط:
.
لقطة شاشة:
الأمر الخاص بك هو الصحيح. فقط تحتاج إلى إضافة -L إلى grep.
find / -type f -exec grep -l 'text-to-find-here' {} \;