it-swarm.asia

grep العودية: استبعاد الدلائل المحددة

أستخدم grep العودية كثيرًا للعثور على الملفات المصدر ذات المحتوى المحدد.

grep -Rni "myfunc" .

في قواعد الشفرة الكبيرة ، يمكن أن يصبح هذا بطيئًا ، لذا يمكنني استخدام --incldue لتقييد/تمديد القائمة البيضاء.

grep -Rni --include=*.Java "myfunc" .

ومع ذلك ، سيكون من الأفضل استبعاد (Prune) الدلائل الفرعية بالكامل ، وأنا أفكر:

grep -Rni --exclude=/.svn/ "myfunc" .

لكن - باستثناء يدعم فقط أنماط الملفات مثل * .Java أعلاه. كيف يمكنني استبعاد الدلائل؟

47
gabor

قد تنظر إلى ack .

لقد بدأت للتو استخدامه ولكن يبدو أنه مناسب تمامًا لهذا الغرض.

10
Alex Feinman
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

المصدر: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using

60
Henrik

يمكنك استخدام البحث بدلاً من ذلك:

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print

حسنًا ، هذا قليل إلى الوراء ، ستحصل على نتائج grep أولاً و ثم المسار. ربما شخص آخر لديه إجابة أفضل؟

6
Josh

فيما يلي مثال كامل من أحد البرامج النصية في أحد المشاريع التي قد يساعدها ، أسمي هذا الملف "all_source" (تم وضع علامة قابلة للتنفيذ) وأضعه في المجلد الجذر لمشروعي ثم أسميه كـ grep myfunc $(./all_source) - الفرز في نهاية البرنامج النصي هو اختياري تماما.

#!/bin/bash

find . \
    -type d \( \
            -wholename './lib' -o \
            -wholename './vc6' -o \
            -name 'gen' -o \
            -name '.svn' \
            \) -Prune -o \
    -type f \( \
            -name '*.h' -o \
            -name '*.cpp' -o \
            -name '*.c' -o \
            -name '*.lua' -o \
            -name '*.*awk' \) -print \
    | sort

يعرض هذا البرنامج النصي جميع أسماء الملفات في المشروع التي تتطابق مع *.h, *.cpp, *.c, *.lua, *.*awk ، لكنه لا يبحث في جميع المجلدات المسماة .svn والمجلدات gen بالإضافة إلى تخطي المجلدات لـ ./lib و ./vc6 (ولكن فقط تلك الموجودة مباشرة من جذر المشروع). لذلك عندما تقوم بـ grep myfunc $(./all_source) ، فهي تتسرب فقط في تلك الملفات. ستحتاج إلى استدعاء هذا من الجذر للمشروع كذلك.

2
Mike Nelson

يوجد أيضًا خيار -Prune للعثور على:

 find . -path "*/.svn*" -Prune -o -not -type d -exec grep -ni "myfunc" {} \; -print
0
misiu_mp

يمكنك محاولة القيام بذلك:

grep -R  "myfunc" . | grep -v path_to_exclude/

على سبيل المثال: إذا كنت لا تريد البحث في المحتوى في ملفات السجل ، فقم بما يلي:

grep -R "myfunc" . | grep -v log/
0
Akshatha