grep, නමුත් සමහර ගොනු දිගු පමණි


986

මම grepසමහර ඩිරෙක්ටරි වලට ස්ක්‍රිප්ට් ලිවීමට කටයුතු කරමින් සිටිමි , නමුත් මෙම නාමාවලිවල සියලු වර්ගවල ගොනු වර්ග අඩංගු වේ.

මට grepදැන් .hසහ .cppදැන්ම අවශ්‍යයි , නමුත් සමහර විට අනාගතයේ තවත් කිහිප දෙනෙක් විය හැකිය.

මෙතෙක් මා සතුව ඇත්තේ:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/; } 

| mailx -s GREP email@domain.com

විශේෂිත ගොනු දිගු එකතු කරන්නේ කෙසේදැයි කිසිවෙකුට මට පෙන්විය හැකිද?


13
උත්සාහ grep -r -i CP_Image ~/path1/*.{h,cpp}කළාද?

8
රිදී සෙවුම භාවිතා කරන්න : ag -i CP_Image ~/path[1-5] | mailx -s GREP email@domain.com. වැඩේ ඉවරයි.
ජොන්සිවෙබ්


Egrep භාවිතා කරන්න (බොහෝ විට ඔබේ පද්ධතියේ පෙර ස්ථාපනය කර ඇත), එවිට ඔබට රීජෙක්ස් භාවිතා කළ හැකිය.
ඩොග්වෙදර්

8
"එක් දෙයක් කර එය හොඳින් කරන්න" යන මෙවලම් තිබීමේ යුනික්ස් මන්ත්‍රය බිඳ දමමින් ලිපිගොනු සෙවීම සඳහා එකතු -rකළ විට GNU යාලුවෝ අවුල් විය grep. ඉතා පැහැදිලි නමක් සහිත ලිපිගොනු සොයා ගැනීම සඳහා හොඳ මෙවලමක් තිබේ.
එඩ් මෝර්ටන්

Answers:


1388

--includeමේ වගේ පරාමිතිය භාවිතා කරන්න :

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

එය ඔබට අවශ්‍ය දේ කළ යුතුය.

හෝල්ඩ් ඕෆ් හන්ගර්ගේ පිළිතුරෙන් පැහැදිලි කිරීම සඳහා පහත:

  • grep: විධානය

  • -r: පුනරාවර්තනය

  • -i: නොසලකා හරින්න

  • --include \*.cpp: all * .cpp: C ++ ගොනු (ඔබට ගොනු නාමවල තරු ලකුණු සහිත නාමාවලියක් තිබේ නම් \ සමඟ පැන යන්න)

  • ./: වත්මන් නාමාවලියෙන් ආරම්භ කරන්න.


124
වාර්තාව සඳහා: -r (පුනරාවර්තන) -i (නොසලකා හැරීම) - ඇතුළත් කරන්න (ගොනු රටාවට ගැලපෙන ගොනු පමණක් සොයන්න)
ලුයිස්

34
තවදුරටත් ප්‍රශස්තිකරණය කළ හැකියgrep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
zwol

1
-R සංකේතාත්මක සබැඳි සඳහා වන ලේඛනය කොහේද?
ටයිටස්

8
මෙම උදාහරණය ඉහළ ලකුණු ප්‍රමාණයක් ඇති බව පෙනේ, මන්ද එය එතරම් පුළුල් පරාසයක විභවයන් ආවරණය කරන නමුත් පහත දැක්වෙන පිළිතුර grep -r --include = *. Txt 'searchterm' ./ පිළිතුරෙහි සාරය සැබවින්ම පැහැදිලි කරයි
ඩේවිඩ් කැස්පර්

11
බැක්ස්ලෑෂ් වෙනුවට ද්විත්ව මිල ගණන් භාවිතා නොකරන්නේ ඇයි? උදා:grep -r -i --include="*.h" --include="*.cpp" CP_Image
පම්බඩා

293

මෙම පිළිතුරු සමහරක් සින්ටැක්ස් බරින් වැඩි බවක් පෙනෙන්නට තිබුණි, නැතහොත් ඒවා මගේ ඩේබියන් සේවාදායකයේ ගැටළු ඇති කළේය. මෙය මට හොඳින් ක්‍රියාත්මක විය:

grep -r --include=\*.txt 'searchterm' ./

... හෝ සිද්ධි සංවේදී නොවන අනුවාදය ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: විධානය

  • -r: පුනරාවර්තනය

  • -i: නොසලකා හරින්න

  • --include: all * .txt: පෙළ ලිපිගොනු (ඔබට ගොනු නාමවල තරු ලකුණු සහිත නාමාවලියක් තිබේ නම් \ සමඟ පැන යන්න)

  • 'searchterm': සෙවිය යුතු දේ

  • ./: වත්මන් නාමාවලියෙන් ආරම්භ කරන්න.

මූලාශ්‍රය: PHP විප්ලවය: ලිනක්ස් හි ගොනු ග්‍රහණය කරගන්නේ කෙසේද, නමුත් සමහර ගොනු දිගු පමණක්?


7
ඔබ පලා යුතු *භාවිතා \*.cppහෝ '*.cpp'. වැඩකරන නාමාවලියෙහි සමහර *.txtලිපිගොනු අඩංගු වන විට එය අපේක්ෂිත ප්‍රති result ලය ලබා නොදේ .
මෙලෙබියස්

Le මෙලෙබියස් හට එයින් ගැලවීමට අවශ්‍ය වන්නේ මන්දැයි ඔබට පැහැදිලි කළ හැකිය - ඔබ සඳහන් කළ සීපීපී හෝ ටීඑක්ටී දිගු සමඟ එයට කිසියම් සම්බන්ධයක් තිබේද? නැත්නම් ඔබ ඒවා උදාහරණ ලෙස භාවිතා කළාද?
සයිමන් ඊස්ට්

2
Im සිමොන් ඊස්ට් මෙම දීර් ensions කිරීම් මෙම ප්‍රශ්නයේ සහ පිළිතුරේ භාවිතා වන ඒවාය. එය භාවිතා කරන විට පැන නොයාම වැඩ කළ හැකි --include=<pattern>නමුත් වෙනත් ආකාරයකින් බොහෝ සමානකම් දැනෙන (ඒ වෙනුවට අවකාශයක් ) *සමඟ පැන යාම වැදගත්ය . --include <pattern>=
මෙලෙබියස්

55
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./

3
grep -rn "grep කිරීමට යම් දෙයක්" --include = *. {මොඩියුලය, inc, c, h} *
ashish

3
හොඳ පිළිතුරක්. IMO හි පිළිගත් ප්‍රමාණයට වඩා පිරිසිදු නමුත් ඔබ @ ෂිෂ් සඳහන් කළ පරිදි සෙවුම් නිර්ණායක එකතු කළ යුතුය
billynoah

ඇයි --includeඉදිකටු පසු, නැති වෙනත් විකල්ප සමග විකල්පය?
vladkras

la ව්ලැඩ්ක්‍රස්, ඔබ අදහස් කරන්නේ ඉඳිකටුවක්ද? එය --?
heretoinfinity

51

කොහොමද:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

5
මම යෝජනා කරන්නේ එම -nameතර්ක කාණ්ඩගත කිරීමයි. ඔබ එසේ නොකළහොත් අමුතු දේවල් සිදුවිය හැකිය. find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
nullrevolution

සියලුම ඩිරෙක්ටරි වස්තු නොසලකා හැරීමට අතිරේක "-type f" සමඟ භාවිතා කරන්න, ලිපිගොනු ගැන පමණක් උනන්දු වන්න.
කෙන්සායි

1
මම වසර ගණනාවක් තිස්සේ මෙම ක්‍රමය භාවිතා කළ අතර එය ක්‍රියාත්මක වන නමුත් එය පුනරාවර්තන ග්‍රෙප් වලට වඩා මන්දගාමී වේ.
beaudet

A බීඩෙට්ගේ අදහස් දැක්වීම ඇමතීමෙන්, findවිකල්ප වශයෙන් තර්ක එකතු කළ හැකි අතර, කැඳවනු ලැබූ ක්‍රියාවලියේ ආයාචනා අවම කිරීම දක්වා අඩු කළ හැකිය. find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} + පහත දැක්වෙන ෆෙඩෝර්කිගේ පිළිතුරෙන් මෙය යෝජනා කර ඇති නමුත් උද්දීපනය නොකෙරේ. -Hසොයා ගැනීම සඳහා ගැලපෙන තනි ගොනුවක් පමණක් හඳුනාගැනීමේදී මෙහි grep කිරීමේ තර්කය ප්‍රයෝජනවත් වේ. මෙමඟින් -printපිළිතුරේ භාවිතය ඉවත් කළ හැකිය . ඔබගේ සම්පූර්ණ ගොනු ලැයිස්තුව ප්‍රමාණවත් තරම් කුඩා නම්, පුනරාවර්තන ෂෙල් ග්ලෝබ් (උදා. {path1,path2}/**/*.{cpp,h}) භාවිතා කිරීම වඩාත් සුදුසුය.
මැල්කම්

20

HP සහ Sun සේවාදායකයන් සඳහා -r විකල්පයක් නොමැත, මේ ආකාරයෙන් මගේ HP සේවාදායකයේ මා වෙනුවෙන් වැඩ කර ඇත

find . -name "*.c" | xargs grep -i "my great text"

-i යනු නූල පිළිබඳ සංවේදී නොවන සෙවීම සඳහා ය


1
Fgrep සඳහා --include විකල්පය නොමැති වෙබ් සත්කාරක සමාගම් සඳහා සේවාදායක කිහිපයක් මට හමු වී ඇති අතර එම අවස්ථා වලදී මම භාවිතා කරන විධාන රේඛාව මෙයයි.
බොර්ග්බෝයි

වින්ඩෝස් සඳහා Git (MinGW / MSys) භාවිතා කරන විට --include විකල්පය ද නොමැත.
ඩැරන් ලුවිස්

Ar ඩැරන්ලුවිස් වින්ඩෝස් සඳහා Git Bash වෙතින් ලබා ගත හැකිය. නමුත් පුදුමයට කරුණක් නම්, එය වැනි වර්ණවත් අන්වර්ථයන් llඑකතු --color=autoකරන නමුත් grep වලට එකතු නොවේ .
Xeverous

සම්පූර්ණත්වය, අතේ ගෙන යා හැකි බව සහ සංක්ෂිප්තභාවය සඳහා පිළිගත් පිළිතුර මෙය විය යුතුය!
ග්‍රාන්ට් ෆොස්ටර්

12

මෙය ලිපිගොනු සොයා ගැනීමේ කාරණයක් බැවින් , අපි භාවිතා කරමු find!

GNU සොයා ගැනීම භාවිතා කිරීමෙන් ඔබට -regexඑම ගොනු ඩිරෙක්ටරි ගසෙහි දිගුව .hහෝ සොයා ගත හැකිය .cpp.

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

එවිට, එය grepඑහි එක් එක් ප්‍රති results ල ක්‍රියාත්මක කිරීම පිළිබඳ කාරණයක් පමණි :

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

ඔබට මෙම සොයා ගැනීමේ බෙදාහැරීමක් නොමැති නම්, අමීර් ඇෆ්ගනිස්ථාන වැනි ප්‍රවේශයක් භාවිතා කළ -oයුතුය, විකල්පයන් ඒකාබද්ධ කිරීම සඳහා භාවිතා කළ යුතුය ( නම එක්කෝ අවසන් හෝ අවසන් .hවේ.cpp ):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ඔබට සැබවින්ම භාවිතා කිරීමට අවශ්‍ය නම්, මෙහි දක්වා grepඇති වාක්‍ය ඛණ්ඩය අනුගමනය කරන්න --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^


3

ag (රිදී සෙවුම්කරු) මේ සඳහා ඉතා සරල වාක්‍ය ඛණ්ඩයක් ඇත

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

නිසා

ag -G *.h -G *.cpp CP_Image <path>

ag 2.2.0 භාවිතා කරමින්, මගේ ධජ අවසන් වරට තැබීමට මට අවශ්‍ය විය:ag _string_to_find_ -G _filename_regex_
ryanrain

3

පහත පිළිතුර හොඳයි:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

නමුත් යාවත්කාලීන කළ හැක්කේ:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com

වඩා සරල විය හැකි.


1

එක් එක් "-o -name" සඳහා "-exec grep" ලිවිය යුතුය

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

නැතහොත් () අනුව ඒවා කාණ්ඩ කරන්න

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

'-Hn' විකල්පය ගොනුවේ නම සහ රේඛාව පෙන්වයි.


1

මෙම ප්‍රශ්නය ටිකක් දින වකවානු බව මම දනිමි, නමුත් .c සහ .h ගොනු සොයා ගැනීමට මම සාමාන්‍යයෙන් භාවිතා කරන ක්‍රමය බෙදා ගැනීමට කැමැත්තෙමි :

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

හෝ ඔබට රේඛා අංකය අවශ්‍ය නම්:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.