ලිනක්ස් හි නිශ්චිත පෙළ අඩංගු සියලුම ලිපිගොනු සොයා ගන්නේ කෙසේද?


5261

නිශ්චිත පෙළක් අඩංගු සියලුම ලිපිගොනු සඳහා මගේ සම්පූර්ණ ලිනක්ස් පද්ධතිය පරිලෝකනය කිරීමට ක්‍රමයක් සෙවීමට මම උත්සාහ කරමි. පැහැදිලි කිරීම සඳහා, මම සොයන්නේ ගොනුවේ පෙළ මිස ගොනුවේ නම නොවේ.

මම මෙය කරන්නේ කෙසේදැයි සොයා බලන විට, මට මෙම විසඳුම දෙවරක් හමු විය:

find / -type f -exec grep -H 'text-to-find-here' {} \;

කෙසේ වෙතත්, එය ක්රියා නොකරයි. එය පද්ධතියේ සෑම ගොනුවක්ම පෙන්වන බව පෙනේ.

මෙය කළ යුතු නිසි ක්‍රමයට මෙය සමීපද? එසේ නොවේ නම්, මා කෙසේ විය යුතුද? ලිපිගොනු වල පෙළ නූල් සොයා ගැනීමේ මෙම හැකියාව මා කරන සමහර ක්‍රමලේඛන ව්‍යාපෘති සඳහා අසාමාන්‍ය ලෙස ප්‍රයෝජනවත් වනු ඇත.


21
grep ඕනෑම .එකක් තනි අක්ෂර ආදේශක කාඩ්පතක් ලෙස අර්ථකථනය කරන බව මතක තබා ගන්න . මගේ අවවාදය නම් සෑම විටම fgrep හෝ egrep භාවිතා කිරීමයි.
වෝල්ටර් ට්‍රොස්

10
කෙසේ වෙතත්, ඔබ බොහෝ දුරට එහි සිටියා! යන්තම් වෙනුවට -Hසමග -l(හා සමහරවිට grepසමග fgrep). සමහර නම් රටා සහිත ලිපිගොනු බැහැර කිරීම සඳහා ඔබ findවඩාත් දියුණු ආකාරයකින් භාවිතා කරනු ඇත. භාවිතා කිරීමට ඉගෙන ගැනීම වටී find. යන්තම් man find.
වෝල්ටර් ට්‍රොස්

6
find … -exec <cmd> +ටයිප් කිරීමට පහසු සහ වඩා වේගවත් find … -exec <cmd> \;. එය ක්‍රියාත්මක වන්නේ <cmd>ගොනු නාම තර්ක ගණනක් පිළිගන්නේ නම් පමණි . <cmd>පයිතන් හෝ රූබි ස්ක්‍රිප්ට් මෙන් ආරම්භ කිරීම මන්දගාමී නම් ක්‍රියාත්මක කිරීමේ කාලය ඉතිරි කිරීම විශේෂයෙන් විශාල වේ.
hagello

දී ඇති මාර්ගයක පුනරාවර්තන නොවන ලෙස සෙවීම සඳහා විධානය `grep --include = *. Txt -snw" රටාව "thepath / *.
ස්ටෙෆාන් ලෝරන්ට්

@ ස්ටෙෆාන් ලෝරන්ට් මම හිතන්නේ ඔබ එය ඕනෑවට වඩා සංකීර්ණ කරනවා. නිකමට කියන්නgrep "pattern" path/*.txt
ෆෙඩෝර්කි 'SO හානිය නවත්වන්න'

Answers:


9527

පහත සඳහන් දේ කරන්න:

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පරාමිතිය හරහා විශේෂිත නාමාවලියක් (ies) බැහැර කළ හැකිය . උදාහරණයක් ලෙස, මෙය dir dir1 /, dir2 / සහ ඒවා සියල්ලම ගැලපෙන * .dst /: බැහැර කරයි.

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

ඔබ වැනි එකම අරමුණ සාක්ෂාත් කර ගැනීම සඳහා මෙය මට ඉතා හොඳින් ක්‍රියාත්මක වේ.

තවත් විකල්ප සඳහා පරීක්ෂා කරන්න man grep.


74
--exclude භාවිතා කරන්න. "grep -rnw --exclude = *. o 'නාමාවලිය' -e" රටාව "
rakib_

98
එය සඳහන් කිරීම වටී: rවිකල්පය කම්මැලි බව පෙනේ (පළමු ඩිරෙක්ටරියෙන් පසුව නතර වනවාට වඩා ගැඹුරට පළමුව ගමන් කරයි), Rකෑදරකම (මුළු ගසම නිවැරදිව ගමන් කරයි).
එලිරන් මල්කා

5
grep -rnw "මම සොයන නූල්" මට අවශ්‍ය දේ කළා. ස්තූතියි!
විලියස්කේ

33
සටහන (විශේෂයෙන් නවකයින් සඳහා): ඉහත විධානයෙහි උද්ධෘත ලකුණු වැදගත් වේ.
පිස්සු 7

69
Li එලිරන් මල්කා Rඑන් rඩිරෙක්ටරි දෙකම නිවැරදිව ගමන් කරයි, නමුත් Rසංකේතාත්මක සබැඳි අනුගමනය කරනු ඇත.
bzeaman

1502

ඔබට භාවිතා කළ හැකිය grep -ilR:

grep -Ril "text-to-find-here" /
  • i නොසලකා හැරීමේ නඩුව (ඔබේ නඩුවේ විකල්ප).
  • R පුනරාවර්තන යන්නයි.
  • l "ගොනුවේ නම පෙන්වන්න, ප්‍රති result ලයම නොවේ" යන්නයි.
  • / යනු ඔබේ යන්ත්‍රයේ මුල සිට ආරම්භ කිරීමයි.

85
මගේ අත්දැකීම් මත පදනම්ව, -iඑය බොහෝ වේගය අඩු කරයි, එබැවින් අවශ්‍ය නොවේ නම් එය භාවිතා නොකරන්න. එය එක්තරා ඩිර් එකකින් පරීක්ෂා කර සාමාන්‍යකරණය කරන්න. එය මිනිත්තු කිහිපයක් ඇතුළත සම්පූර්ණ කළ යුතුය. නිත්‍ය ප්‍රකාශනයක් මන්දගාමී වනු ඇතැයි මම සිතමි. නමුත් මගේ අදහස් පදනම් වී ඇත්තේ උපකල්පන මත වන අතර, එය ඔබට timeඉදිරියෙන් පරීක්ෂා කිරීමට යෝජනා කරමි .
fedorqui 'SO හානිය නවත්වන්න'

4
ඔව්, ඒ වෙනුවෙන් /*පෙනී සිටියි. කෙසේ හෝ මම එය පරීක්ෂා කර බැලූ විට එය ක්‍රියාත්මක වන බව දුටුවෙමි /.
fedorqui 'SO හානිය නවත්වන්න'

10
ඔබ රීජෙක්ස් භාවිතයෙන් සොයන්නේ නැතිනම් බොහෝ පද්ධතිවල grep වෙනුවට fgrep භාවිතා කළ හැකිය.
markle976

8
ඔව් @ markle976, ඇත්තෙන්ම මිනිසා අයිතිය සුරකියි සිට: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
fedorqui 'SO හානිය නවත්වන්න'

17
ඔබට ඩිරෙක්ටරියට grep -Ril "text-to-find-here" ~/sites/හෝ භාවිතයට මාර්ගය ආදේශ කළ හැකිය . වත්මන් නාමාවලිය සඳහාgrep -Ril "text-to-find-here" .
කළු

330

ඔබට අක්ක් භාවිතා කළ හැකිය . එය ප්‍රභව කේත සඳහා grep වැනි ය . ඔබට එය සමඟ ඔබේ සම්පූර්ණ ගොනු පද්ධතිය පරිලෝකනය කළ හැකිය.

කරන්න:

ack 'text-to-find-here'

ඔබේ මූල නාමාවලිය තුළ.

ඔබට නිත්‍ය ප්‍රකාශන භාවිතා කළ හැකිය, ගොනු වර්ගය සඳහන් කරන්න.


යාවත්කාලීන කරන්න

මම රිදී සෙවුම සොයාගත්තෙමි , එය අක්ක් වැනි නමුත් ඊට වඩා 3-5x වේගවත් වන අතර .gitignoreගොනුවක රටා පවා නොසලකා හරියි .


57
ඉතා ප්රයෝජනවත්, සරල හා වේගවත්. අවවාදයයි: "ඩේබියන්-ව්‍යුත්පන්න ඩිස්ට්‍රෝස් මත, අක්ක්" ඇක්-ග්‍රෙප් "ලෙස ඇසුරුම් කර ඇති නිසා" අක්ක් "දැනටමත් පැවතුනි" ( beyondgrep.com/install වෙතින් ). ඔබට එම ලිනක්ස් වල කන්ජි කේත පරිවර්තකයක් ධාවනය කිරීම අවසන් විය හැකිය ...
ජෝස්_ජීඩී

11
ack හෝ ack-grep හි හොඳ ඉස්මතු කිරීම් ඇත, නමුත් නිසි ලෙස භාවිතා කරන විට + grep සොයා ගැනීම කාර්ය සාධනයට වඩා හොඳය
Sławomir Lenart

14
රිදී සෙවුම් සහ සරල ඔල් ග්‍රෙප් ද ඇතුළුව මෙහි සඳහන් සියල්ලටම වඩා රිප්ග්‍රෙප් වේගවත් බව සලකන්න . සාක්ෂි සඳහා මෙම බ්ලොග් සටහන බලන්න .
රේඩන් රොස්බරෝ

195

ඔයාට පාවිච්චි කරන්න පුළුවන්:

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 / or / file -r: පුනරාවර්තන සෙවුම් n: රේඛා අංකය ගැලපීම් සඳහා පෙන්වනු ඇත


1
සොයාගත් අනුවාදය සඳහා ස්තූතියි. මගේ grep අනුවාදයේ (NAS සඳහා කාර්යබහුල පෙට්ටිය) -r විකල්පයක් නොමැත, මට ඇත්තටම වෙනත් විසඳුමක් අවශ්‍යයි!
jc

3
'සොයා' අනුවාදයට ස්තූතියි! එය එතරම් වැදගත් 'විසින් පෙරහන් කිරීමට හැකි වනු ඇත .js' හෝ ' .txt', ආදිය කවුරුවත් පසුගිය පවුලේ නිවාඩු සියලු බහු-Gigabyte වීඩියෝ සොයමින් අවසන් කිරීමට අයිතිය සුරකියි බලා පැය ගත කිරීමට කැමතිය, මෙම විධානය පවා නම් ටයිප් කිරීමට පහසුය.
බලගතු

පිළිගත් අනුවාදයට වඩා හොඳ
ග්‍රෙප්


74

දී ඇති පෙළක් අඩංගු ගොනු නාම ලැයිස්තුව

පළමුවෙන්ම, මම විශ්වාස කරන්නේ ඔබ ඒ -Hවෙනුවට භාවිතා කර ඇති -lබවයි. ඔබට පසුව උපුටා දැක්වීම් ඇතුළත පෙළ එක් කිරීමට උත්සාහ කළ හැකිය {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

උදාහරණයක්

ඔබගේ නාමාවලිය තුළ "Apache බලපත්‍රය" යන විශේෂිත පෙළ අඩංගු ලිපිගොනු සොයමින් සිටින බව කියමු. එය ප්‍රති results ල පහළින් තරමක් සමාන වනු ඇත (ඔබේ නාමාවලි අන්තර්ගතය මත පදනම්ව ප්‍රතිදානය වෙනස් වේ).

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$ 

සිද්ධි සංවේදීතාව ඉවත් කරන්න

"ටෙක්ස්ට්" එදිරිව "ටෙක්ස්ට්" වැනි නඩුව ගැන ඔබ භාවිතා නොකළද, නඩුව -iනොසලකා හැරීමට ඔබට ස්විචය භාවිතා කළ හැකිය. වැඩි විස්තර මෙතැනින් කියවිය හැකිය .

මෙය ඔබට උපකාරී වේ යැයි සිතමි.


2
මෙම විධානය කරන්නේ එයයි: findඑය සොයා ගන්නා සියලු මාර්ගයන් විධානය වෙත යොමු කරයි grep -l "text-to-find-here" <file found>". ඔබට ගොනුවේ නමට සීමාවන් එකතු කළ හැකිය, උදා: find / -iname "*.txt"නම අවසන් වන ලිපිගොනු තුළ පමණක් සෙවීම.txt
මෙනේ

1
X සහායක - පා .කයන්ට කිසිදු ව්‍යාකූලත්වයක් ඇතිවීම වළක්වා ගැනීම සඳහා නියැදි ප්‍රතිදානයක් ඇතුළත් කර ඇත.
lkamal

2
EneMene ඇත්තෙන්ම කනගාටුදායක කරුණක් වන්නේ සහායකයාගේ අදහස් දැක්වීමට වඩා ඔබට වඩා වැඩි ඡන්ද ප්‍රමාණයක් තිබීමයි ... ඔවුන්ගේ ප්‍රකාශය 2014 සිට සහ ඔබගේ 2017 වුවද ඔවුන්ගේ අදහස් 6 ට 6 ක් ඇති විට එය හරියටම 0 තිබිය යුතු අතර ඔබට ඇත්තේ එක් (දැන් දෙකක්) පමණි මම විශ්වාස කිරීමට කැමති දෙයක් නොවේ.
ප්‍රිෆ්ටන්

@Mene එකී කරුණ සඳහන් -inameඑය ද, .txt ගොනු සොයා දෙනු උදාහරණයක් ලෙස, මෙන්ම TXT හා TXT සහ එසේ මත, ඉන් අදහස් වන්නේ නඩුව-අසංවේදී ය.
ප්‍රිෆ්ටන්

66

grep( GNU හෝ BSD )

grepවත්මන් ෆෝල්ඩරය නැවත නැවත සෙවීමට ඔබට මෙවලම භාවිතා කළ හැකිය , වැනි:

grep -r "class foo" .

සටහන: -r- පුනරාවර්තනව උප බහලුම් සොයන්න.

විශේෂිත ලිපිගොනු තුළ සෙවීම සඳහා ඔබට ග්ලෝබින් සින්ටැක්ස් භාවිතා කළ හැකිය:

grep "class foo" **/*.c

සටහන: ග්ලෝබිං විකල්පය ( **) භාවිතා කිරීමෙන් , එය සියළුම ලිපිගොනු නිශ්චිත දිගුවකින් හෝ රටාවකින් පුනරාවර්තනය කරයි. මෙම වාක්‍ය ඛණ්ඩය සක්‍රීය කිරීමට, ධාවනය කරන්න : shopt -s globstar. ඔබට **/*.*සියලු ලිපිගොනු (සැඟවුණු හා දිගුවකින් තොරව) හෝ වෙනත් රටාවක් සඳහාද භාවිතා කළ හැකිය .

ඔබේ තර්කය දිග වැඩියි යන දෝෂය ඔබ සතුව ඇත්නම්, ඔබගේ සෙවුම පටු කිරීම ගැන සලකා බලන්න, හෝ findඒ වෙනුවට සින්ටැක්ස් භාවිතා කරන්න :

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

විකල්පයක් ලෙස භාවිතා කරන්න ripgrep.

ripgrep

ඔබ විශාල ව්‍යාපෘති හෝ විශාල ලිපිගොනු වල වැඩ කරන්නේ නම්, ripgrepඒ වෙනුවට ඔබ භාවිතා කළ යුත්තේ :

rg "class foo" .

GitHub ව්‍යාපෘති පිටුවේ ලේඛන, ස්ථාපන පියවර හෝ ප්‍රභව කේතය පරීක්ෂා කරන්න .

එය කඩිනම් වැනි වෙනත් ඕනෑම මෙවලමක් වඩා දෙයක් GNU / BSD grep , ucg, ag, sift, ack, ptඑහි මුදුනේ ඉදි බැවින් හෝ ඒ හා සමාන රස්ට් ගේ regex එන්ජිම ඉතා වේගවත් සොයමින් කිරීමට පරිමිත automata, SIMD හා දැඩි ප්රායෝගික ප්රතිස්තිකරණය යොදා ගන්නා.

.gitignoreලිපිගොනු වල දක්වා ඇති රටා නොසලකා හැරීමට එය සහාය දක්වයි , එබැවින් එකවර විවිධ ගෝලීය රටාවන්ට එරෙහිව තනි ගොනු මාර්ගයක් ගැලපේ.


ඔබට පොදු පරාමිතීන් භාවිතා කළ හැකිය:

  • -i - සංවේදී සෙවීම.
  • -I - ද්විමය ගොනු නොසලකා හරින්න.
  • -w - සම්පූර්ණ වචන සඳහා සොයන්න (අර්ධ වචන ගැලපීමට ප්‍රතිවිරුද්ධව).
  • -n - ඔබේ තරඟයේ රේඛාව පෙන්වන්න.
  • -C/ --context(උදා -C5) - සන්දර්භය වැඩි කරයි, එවිට ඔබට අවට කේතය පෙනේ.
  • --color=auto - ගැලපෙන පෙළ සලකුණු කරන්න.
  • -H - පෙළ සොයාගත් තැන ගොනු නාමය පෙන්වයි.
  • -c- ගැලපෙන රේඛා ගණන පෙන්වයි. සමඟ ඒකාබද්ධ කළ හැකිය -H.

1
දිගු ග්ලෝබින් කිරීමද ප්‍රයෝජනවත් බව මට පෙනේ. නමුත් මතක තබා ගන්න ඇත්ත වශයෙන්ම විශාල ගොනු සංඛ්‍යාවක් තිබේ නම්, ඔබට "තර්ක ලැයිස්තුව දිගු" දෝෂයක් ලබා ගත හැකිය. (සරල ග්ලෝබ් කිරීම ද මේ ආකාරයේ දෝෂයකට ගොදුරු වේ).
යූරි එන්

2
සම්පූර්ණ ගොනු පද්ධතියක් ආශ්වාස කිරීම සඳහා, rg යනු වෙනත් ඕනෑම මෙවලමකට වඩා වේදනාකාරී වනු ඇත.
lk

55

ඔබ 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 - ගැලපෙන රේඛාව පමණක් ප්‍රතිදානය කරන්න (ගොනු නාමය නොවේ)

3
කිසිවක් සොයාගත නොහැකි grep 'text-to-find-here'නම් මෙය ගොනු නාමයක් නොමැතිව සමාන වේ find. මෙය පරිශීලක ආදානය සඳහා රැඳී සිටිනු ඇත! --no-run-if-emptyවිකල්පයක් ලෙස එකතු කරන්න xargs.
hagello

3
ලිපිගොනු හෝ නාමාවලි නාමවල අවකාශයන් තිබේ නම් (සොයාගැනීම් සහ xargs සංයෝජනය) අපේක්ෂිත පරිදි ක්‍රියා නොකරයි. භාවිතා කරන්න find … -exec grep … +. Xargs සමඟ සොයා ගැනීම භාවිතා කිරීමට ඔබ බල කරන්නේ නම්, භාවිතා කරන්න -print0සහ -0.
hagello

43
grep -insr "pattern" *
  • i: PATTERN සහ ආදාන ලිපිගොනු දෙකෙහිම සිද්ධි වෙනස්කම් නොසලකා හරින්න.
  • n: එක් එක් නිමැවුම් පේළිය එහි ආදාන ගොනුව තුළ 1 පාදක රේඛා අංකය සමඟ උපසර්ගය කරන්න.
  • s: නොපවතින හෝ කියවිය නොහැකි ලිපිගොනු පිළිබඳ වැරදි පණිවිඩ යටපත් කරන්න.
  • r: එක් එක් නාමාවලිය යටතේ ඇති සියලුම ලිපිගොනු පුනරාවර්තනයෙන් කියවන්න.

3
ඔබේ පිළිතුර අනෙක් පිළිතුරු වලට වඩා දියුණු වන්නේ කෙසේද, නැතහොත් එය ඒවාට වඩා ප්‍රමාණවත් වන්නේ කෙසේද යන්න ඔබට පැහැදිලි කළ හැකිද?
ආමොස් එම්. වඩු කාර්මික

මතක තබා ගැනීම එතරම් සංකීර්ණ නොවන අතර, සියලු රටාවන් ආවරණය කරනු ඇත (සිද්ධි-සංවේදීතාව -> අක්‍රීය, ගොනු නාම සහ රේඛා අංකය ඇතුළත් වන අතර පුනරාවර්තන සෙවීම යනාදිය සිදු කරනු ඇත) සහ අවසානයේ "*" භාවිතා කිරීමෙන් සියලුම නාමාවලි සොයනු ඇත (කිසිවක් සඳහන් කිරීමට අවශ්‍ය නැත මාර්ගය හෝ නාමාවලි නම).
enfinet

කණගාටුයි, මම වඩාත් පැහැදිලි විය යුතුව තිබුණි: ඔබේ පිළිතුරට එම පැහැදිලි කිරීම ඇතුළත් කළ හැකි නම් එය ඉතා හොඳ වේ. එය දැනටමත් පවතින වෙනත් බොහෝ සමාන පිළිතුරු සමඟින් , පිළිගත් පිළිතුරට වඩා ඉහළින් උත්සාහ කිරීමෙන් හෝ ඉහළට ඔසවා තැබූ පිළිතුරෙන් කුමක් වේද යන්න මෙතරම් කෙටි පිළිතුරකින් දැකීම දුෂ්කර ය.
ආමොස් එම්. වඩු කාර්මික

6
Ans AmosM.Carpenter මෙම පිළිතුරට මා ප්‍රිය කරන එක් දෙයක් නම්, යටපත් කිරීමේ තර්කය පෙන්වා දීමයි, එමඟින් අපට සැබවින්ම අවශ්‍ය ප්‍රති results ල ලබා ගැනීමට වැදගත් නොවන ශබ්දය පෙරීමට උපකාරී වේ. ග්‍රෙප් විසින් ඇතැම් "ලිපිගොනු" මත "ක්‍රියාකාරීත්වය ක්‍රියාත්මක නොකෙරේ", "අවලංගු තර්කය", "සම්පත් නොමැත" වැනි දෝෂ මුද්‍රණය කරයි.
leetNightshade

@leetNightshade: මම හිතන්නේ ඔබ ඔබේ අදහස මට ආමන්ත්‍රණය කළේ විරල මුල් තනතුර ගැන පැහැදිලි කිරීමක් ඉල්ලා සිටි නිසාය. කරුණාකර මගේ පෙර අදහස් අර්ථවත් කිරීම සඳහා ෆේබියෝගේ විශිෂ්ට සංශෝධනය බලන්න .
ආමොස් එම්. වඩු කාර්මික

39

ද සිල්වර්සර්චර් නමින් නව උපයෝගීතාවයක් ඇත

sudo apt install silversearcher-ag

එය Git සහ අනෙකුත් VCS සමඟ සමීපව ක්‍රියා කරයි. එබැවින් ඔබට .git හෝ වෙනත් නාමාවලියකින් කිසිවක් ලැබෙන්නේ නැත .

ඔබට සරලව භාවිතා කළ හැකිය

ag "Search query"

එය ඔබ වෙනුවෙන් කාර්යය කරනු ඇත!


35

ලිනක්ස් හි නිශ්චිත පෙළ අඩංගු සියලුම ලිපිගොනු සොයා ගන්නේ කෙසේද? (...)

මට මෙම විසඳුම දෙවරක් හමු විය:

find / -type f -exec grep -H 'text-to-find-here' {} \;


ඔබගේ උදාහරණයේ මෙන් සොයා ගැනීම භාවිතා කරන්නේ නම් , නිකුත් කළ අවසරය ප්‍රතික්ෂේප කළ පණිවිඩ බොහොමයක් වළක්වා ගැනීම සඳහා -s( --no-messages) වෙත වඩා හොඳ එකතු කරන්න grep, සහ :2>/dev/nullgrepfind

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

සොයා ගැනීම යනු යුනික්ස් වැනි වේදිකාවල - විශේෂිත පෙළ සොයන විට grep සමඟ ඒකාබද්ධව ගොනු සෙවීමේ සම්මත මෙවලමයි. මෙම සොයා විධානය බොහෝ විට සමග සංකලනය වී ඇත xargs මාර්ගය විසින්,.

එකම අරමුණක් සඳහා වේගවත් හා පහසු මෙවලම් පවතී - පහත බලන්න. ඒවා ඔබගේ වේදිකාවේ තිබේ නම් ඒවා උත්සාහ කිරීම වඩා හොඳය :

වේගවත් හා පහසු විකල්ප

RipGrep - වටා වේගවත්ම සෙවුම් මෙවලම:

rg 'text-to-find-here' / -l

රිදී සෙවුම්කරු :

ag 'text-to-find-here' / -l

අක් :

ack 'text-to-find-here' / -l

සටහන: 2>/dev/nullබොහෝ වැරදි පණිවිඩ සැඟවීමට ඔබට මෙම විධානයන්ට එකතු කළ හැකිය .


අවවාදයයි : ඔබට එය සැබවින්ම වළක්වා ගත නොහැකි නම්, දිගු හා අකාර්යක්ෂම සෙවුමක් වළක්වා ගැනීමට '/' (මූල නාමාවලිය) වෙතින් සොයන්න එපා! එබැවින් ඉහත උදාහරණ වලදී, ඔබ ' / ' උප නාමාවලි නාමයකින් ආදේශ කිරීම වඩා හොඳය , උදා: "/ home" ඔබට සැබවින්ම සෙවීමට අවශ්‍ය ස්ථානය අනුව ...


'යුනික්ස් වැනි වේදිකාවල නිශ්චිත පෙළ අඩංගු ලිපිගොනු සෙවීම සඳහා සම්මත මෙවලම සොයා ගැනීම' මට තරමක් අපැහැදිලි ය. පුනරාවර්තනයට අමතරව grep findපෙළ සඳහා ලිපිගොනු කෙලින්ම සොයන්නේ නැත. සමහර විට එම අතිරේක මෙවලම් සමහර අයට ප්‍රයෝජනවත් විය හැකි නමුත් පැරණි ටයිමරයන් සහ උදාgrep . ඒවා නිෂ් less ල යැයි නොකියයි.
ප්‍රිෆ්ටන්

".... නිශ්චිත පෙළ අඩංගු වේ ...": වාක්‍යයේ මෙම කොටස නිවැරදි නොවීය (මන්ද එය සෙවුමේ මෙම කොටස සමඟ කටයුතු කරන බව සොයාගත නොහැකි බැවිනි). සංස්කරණය කරන ලදි. ස්තූතියි.
Bludzee

උදව් කිරීමට ලැබීම සතුටක්! ඉතා ඉතා ඉක්මන් බැල්මකින් එකම වෙන දෙයක් යන වචනය වෙනස් වෙයි ෆෝල්ඩරය වෙත බහලුම , නමුත් මම ඒ මම සම්පූර්ණයෙන්ම ජයග්රහණය නැහැ මගේ කුරුස යුද්ධය කියලා. අත්හරින්නේ නැහැ ...
ප්‍රිෆ්තාන්

"ෆෝල්ඩරය" වෙනුවට "නාමාවලිය" නොවන්නේ ඇයි, නමුත් ඇයි? කරුණාකර ඔබේ "කුරුස යුද්ධය" බෙදා ගන්න!
බ්ලඩ්සි

මම කියන්නේ ඒ වෙනුවට ඩිරෙක්ටරිය භාවිතා කරන්න! යොමු දක්වමින්: ඔබ '/' උප ෆෝල්ඩර නාමයකින් ආදේශ කිරීම වඩා හොඳය. එය මගේ සුරතල් සතෙකි .. වින්ඩෝස් පවා එය 'නාමාවලිය' ලෙස හැඳින්වූ බැවින්. අහ්..ඔබට ඒක තේරුණා. මන්ද? හොඳයි, එය හැඳින්වෙන්නේ එයයි. එය ගොනු පද්ධති මට්ටමින් ද හැඳින්වේ. මේ දෙස බලන්න: එය කවදා හෝ (ඩොස් සඳහා) කැඳවා folතිබේද? නෑ ඇත්තෙන්ම නෑ; එය හැඳින්වූයේ dir(එය තවමත් පවතින බව මම විශ්වාස කරමි). ෆෝල්ඩරය යනු පරිශීලක සුහදතාව සඳහා නිර්මාණය කර ඇති දෙයක් වුවද, මේ අවස්ථාවේ දී එය අඩු 'දියුණු' පරිශීලකයින් සඳහා පහත් කර දැමිය හැකිද?
Pryftan

29

උත්සාහ කරන්න:

find . -name "*.txt" | xargs grep -i "text_pattern"

5
මෙය සැබවින්ම භාවිතා නොකළ යුතු බවට ප්‍රධාන උදාහරණයකි xargs.. මෙය සලකා බලන්න. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo. මෙම xargsමෙතන වැරදි ගොනු ගැලපෙන හා අදහස් ගොනු නොගැලපේ. එක්කෝ පාවිච්චි කරන්න, find .. -print0 | xargs -0 ...නමුත් එය පයිප්පයක find ... -exec grep ... {} +
නිෂ් less ල භාවිතයක්

29

pwdඔබ සිටින ඕනෑම නාමාවලියකින් සෙවීමට භාවිතා කරන්න , පහළට පුනරාවර්තනය වේ

grep -rnw `pwd` -e "pattern"

යාවත්කාලීන කිරීම ඔබ භාවිතා කරන grep අනුවාදය මත පදනම්ව, ඔබට මඟ හැරිය හැක pwd. නව සංස්කරණ වලදී .grep සඳහා පෙරනිමි අවස්ථාව ලෙස පෙනේ නම් මේ අනුව කිසිදු නාමාවලියක් ලබා නොදේ:

grep -rnw -e "pattern"

හෝ

grep -rnw "pattern"

ඉහත ආකාරයටම කරනු ඇත!


3
pwdඑය පෙරනිමිය බැවින් භාවිතා කිරීම කිසිසේත් අවශ්‍ය නොවේ. grep -rnw "pattern"ප්‍රමාණවත්.
fedorqui 'SO හානිය නවත්වන්න'

ඇත්ත වශයෙන්ම ඒ grep -rnwහා සමාන වන්නේ මීට වසර තුනකට පෙර පිළිතුරු දුන් ආකාරයටම, මෙම පිළිතුර අගය එකතු කරන්නේ කෙසේදැයි මම නොදනිමි.
fedorqui 'SO හානිය නවත්වන්න'

තෝරාගත් පිළිතුර සුපුරුදු රටාව නොපෙන්වන අතර මිනිසුන් 5 දෙනෙකු එය ප්‍රයෝජනවත් බව පෙනේ
mahatmanich

"පෙරනිමි රටාව" සමඟ ඔබ අදහස් කරන්නේ කුමක්ද? පිළිගත් පිළිතුරෙහි grep -rnw '/path/to/somewhere/' -e "pattern"ඔබ මෙහි ඇති දේ අඩංගු වේ . 2.3M සංචාරයෙන් පසු ඡන්ද 5 ක් එතරම් අදහස් නොකෙරේ.
fedorqui 'SO හානිය නවත්වන්න'

මම එකඟ වෙමි :-) මුල් පිළිතුරේ මා අතපසු වී ඇත්තේ ඔබ කිසිසේත් මාර්ගයක් ලබා දිය යුතු නැතිනම් හෝ පිළිගත් පිළිතුරෙන් පිළිබිඹු නොවන වත්මන් නාමාවලිය පුනරාවර්තනයෙන් සෙවීම නොවේ. මේ අනුව මඳක් ගැඹුරට හාරා බැලීම grep පිළිබඳ හොඳ ඉගෙනීමේ අත්දැකීමක් විය.
mahatmanich

19

grep අපි නූලක් සොයන්නේ නැති වුවද භාවිතා කළ හැකිය.

සරලව ධාවනය,

grep -RIl "" .

සියලු පෙළ ලිපිගොනු වෙත මාර්ගය මුද්‍රණය කරයි, එනම් මුද්‍රණය කළ හැකි අක්ෂර පමණක් අඩංගු වේ.


2
හුදෙක් lsහෝ find(පුනරාවර්තන සඳහා) භාවිතා කරනවාට වඩා මෙය හොඳ වන්නේ කෙසේදැයි මට නොපෙනේ
ෆෙඩෝර්කි 'එස්ඕ' හානිය නතර කිරීම '

17

ගොනුව සෙවීම සඳහා භාවිතා කළ හැකි විධාන ලැයිස්තුව මෙන්න.

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

5
පවතින පිළිතුරු වලට මෙය එකතු කරන්නේ කුමක් ද?
fedorqui 'SO හානිය නවත්වන්න'

edfedorqui egrepසමාන වන grep -Eඅතර එයින් අදහස් කරන්නේ --extended-regexpඔබට මෙහි විස්තර සොයාගත හැකි බවයි unix.stackexchange.com/a/17951/196072
omerhakanbilici

17

රිදී සෙවුම් යනු භයානක මෙවලමකි, නමුත් රිප්ග්‍රෙප් ඊටත් වඩා හොඳ විය හැකිය.

එය ලිනක්ස්, මැක් සහ වින්ඩෝස් වල ක්‍රියාත්මක වන අතර එය හැකර් නිවුස් හි ලියා ඇත මීට මාස කිහිපයකට පෙර හි (මෙය ඇන්ඩ rew ගැලන්ට්ගේ බ්ලොග් අඩවියට GitHub සබැඳියක් ඇත):

Ripgrep - නව විධාන රේඛා සෙවුම් මෙවලමක්


15
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

15

උත්සාහ කරන්න:

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' {} \;

සමහර විට ෆෝල්ඩරවල වෙනස්කම් පිළිබඳ විස්තර බොහෝ දෙනෙකුට පැහැදිලිව පෙනේ ... නමුත් නවකයින් සඳහාද එය බෙහෙවින් උපකාරී වේ. +1
nilon

1
පවතින පිළිතුරු වලට මෙය එකතු කරන්නේ කුමක් ද?
fedorqui 'SO හානිය නවත්වන්න'

එය මගේ කුරුස යුද්ධය ලෙස හඳුන්වන්න, නමුත් වචනය 'නාමාවලිය' වේ. මෙය වින්ඩෝස් නොවේ (කෙසේ වෙතත් 'ඩිරෙක්ටරි' භාවිතා කිරීමට භාවිතා කරන ලදි - පෙර 9x). කරුණාකර 'ෆෝල්ඩරය' යැයි පැවසීම නවත්වන්න. ඔබගේ අවසාන විධානය සඳහා ඔබට '/' යන්තම් FYI පවා අවශ්‍ය නොවේ.
ප්‍රිෆ්ටන්

15

මෙය උපකාරයක් වේ යැයි සිතමු ...

grepනිමැවුමේ වැඩි විස්තර ලබා දීම සඳහා ටිකක් පුළුල් කිරීම , උදාහරණයක් ලෙස, පෙළ ඇති ගොනුවේ රේඛා අංකය ලබා ගැනීම සඳහා පහත පරිදි කළ හැකිය:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

ලිපිගොනු වර්ගය කුමක්දැයි ඔබට අදහසක් තිබේ නම්, සෙවීම සඳහා ගොනු වර්ග දිගුවන් සඳහන් කිරීමෙන් ඔබේ සෙවුම අඩු කළ හැකිය, මේ අවස්ථාවේ දී .pasහෝ .dfmගොනු:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

විකල්ප පිළිබඳ කෙටි පැහැදිලි කිරීම:

  1. .තුළ findවත්මන් බහාළුම සිට නියම කරනු ලබයි.
  2. -name" *.*": සියලුම ලිපිගොනු සඳහා (-name " *.pas" -o -name " *.dfm"): *.pasOR *.dfmගොනු පමණක් හෝ නිශ්චිතව දක්වා ඇත-o
  3. -type f ඔබ ලිපිගොනු සොයන බව නියම කරයි
  4. -print0හා --nullඑම අනෙක් පැත්තේ |(නල) අතිශය වැදගත් අය, සිට ගොනු නාමය පසුකර ඇත findවෙත grepතුළ කා වැදී xargs, එම ගොනු නාමය දී හිස් අවකාශයක් ගොනු නාමය සම්මත කිරීම සඳහා ඉඩ අයිතිය සුරකියි එක් string ලෙස මාර්ගය හා ගොනු ප්රතිකාර ගැනීමට ඉඩ සලසමින්, එක් එක් අවකාශය මත එය බිඳ නොදමන්න.

-name '*.*'ඔබ කියන දේ නොවේ; රටාව එයට සමාන නොවන නිසා එය 'ගොනුව' නමින් ගොනුවක් තෝරා නොගනී (.ext නැත); *කෙසේ වෙතත් (හොඳයි. ගොනු පසෙකට දමනු ඇත). නමුත් තවත් දෙයක් තිබේ: ඔබට සියලු ලිපිගොනු අවශ්‍ය නම් ගොනු නාමයක් මුලින් සඳහන් කිරීමට කරදර වන්නේ ඇයි? වෙනත් කිසිදු අදහසක් නැත - එම්එස් පාරිභාෂිතය 'ෆෝල්ඩරය' භාවිතා නොකරන අය තවමත් සිටින බව දැන ගැනීම සතුටක් (ඇත්තෙන්ම එය ප්‍රමාණවත් යැයි පැවසීමෙන් පසු මම එකතු නොකරමි, නමුත් ඔබ කළ තරමක් වැරදි ප්‍රකාශය පෙන්වා දීමට මට අවශ්‍ය විය ගොනු නාම සමඟ - මෙන්ම 'සියල්ල' හි අතිරික්තය / නිෂ් less ල බව).
ප්‍රිෆ්ටන්

15

සරල findකෙනෙකුට පහසුවෙන් වැඩ කළ හැකිය. එය ඔබගේ ~/.bashrcගොනුවේ අන්වර්ථය :

alias ffind find / -type f | xargs grep

නව පර්යන්තයක් ආරම්භ කර නිකුත් කරන්න:

ffind 'text-to-find-here'

14

මම පයිතන් පිටපතක් ලිව්වා . යමෙකු මෙම ස්ක්‍රිප්ට් භාවිතා කළ යුතු ආකාරය මෙයයි.

./sniff.py path pattern_to_search [file_pattern]

පළමු තර්කය, pathඅප පුනරාවර්තනයෙන් සොයන නාමාවලියයි. දෙවන තර්කය, pattern_to_searchගොනුවක සෙවීමට අවශ්‍ය නිත්‍ය ප්‍රකාශනයකි. අපි පයිතන් re පුස්තකාලයේ අර්ථ දක්වා ඇති සාමාන්‍ය ප්‍රකාශන ආකෘතිය භාවිතා කරමු . මෙම පිටපතෙහි, .නව රේඛාවටද ගැලපේ.

තෙවන තර්කය, file_pattern විකල්පයකි. මෙය ගොනු නාමයක් මත ක්‍රියා කරන තවත් නිත්‍ය ප්‍රකාශනයකි. මෙම නිත්‍ය ප්‍රකාශනයට ගැලපෙන ලිපිගොනු පමණක් සලකා බලනු ලැබේ.

උදාහරණයක් ලෙස, වචනයෙන් පසුව දිගුව pyසහිත පයිතන් ලිපිගොනු සෙවීමට මට අවශ්‍ය නම් , මම පහත සඳහන් දේ කරමි,Pool(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 

වොයිලා, එය ගැලපෙන ලිපිගොනු වල මාර්ගය සහ තරගය සොයාගත් රේඛා අංකය ජනනය කරයි. එකකට වඩා ගැලපීම් හමු වූවා නම්, එක් එක් පේළි අංක ගොනු නාමයට එකතු වේ.


14

ඔබට තදින් භාවිතා කිරීමට අවශ්‍ය findනම් භාවිතා කරන්න find + grep:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

පියවර:

1. findලිපිගොනු සෙවීමට
භාවිතා කරන්න , 2. ඉන්පසු ක්‍රියාත්මක කරන්නgrep කරන්න.

මෙමඟින් ඔබට findගොනු සොයා ගැනීමේ බලය ලබා දිය හැකිය.

  • -name Patternඔබට grepසමහර ලිපිගොනු පමණක් අවශ්‍ය නම් භාවිතා කරන්න :

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

ඔබට එය සමඟ සෙල්ලම් කළ හැකි findඅතර ඔබගේ ගොනු සෙවීම වැඩි දියුණු කිරීමට හෝ අඩු කිරීමට විවිධ විකල්ප භාවිතා කළ හැකිය .


මොකක්ද වෙනස? එය ගොනු මාර්ගයේ ඇති අවකාශයන් සමඟ ක්‍රියා කරයිද?
පීටර් මෝර්ටෙන්සන්

13

භාවිත:

grep -c Your_Pattern *

වත්මන් නාමාවලියෙහි ඇති එක් එක් ලිපිගොනු තුළ ඔබගේ රටාවේ පිටපත් කීයක් තිබේද යන්න මෙය වාර්තා කරයි.


13

මෙය සාක්ෂාත් කර ගැනීමට grep ඔබේ හොඳ මිතුරා ය.

grep -r <text_fo_find> <directory>

සොයා ගැනීමට පෙළ පිළිබඳ සිද්ධිය ගැන ඔබ තැකීමක් නොකරන්නේ නම්, භාවිතා කරන්න:

grep -ir <text_to_find> <directory>

මගේ නාමාවලිය එය නාමාවලිය නියම කළත් එය සෑම තැනකම සොයන බවක් පෙනේ
පැට්‍රොස්

Ath පාත්‍රෝස් බොහෝ විට පුනරාවර්තනය සක්‍රීය කර ඇති අතර ඔබ සඳහන් කරන නාමාවලිය. පුනරාවර්තනය මගින් වෙනත් ආකාරයකින් දේවල් වෙනස් කරයි.
ප්‍රිෆ්ටන්

Ath පැට්‍රොස් ඔහ්, සෙවුම් දාමයේ කිසියම් දෙයක් තිබේ නම්, ඔබට මුලින්ම ග්‍රහණය -කර ගැනීමට අවශ්‍ය වනු ඇත --; වෙනත් ආකාරයකින් සිත්ගන්නා අතුරු ආබාධ ඇති කළ හැකිය!
Pryftan

13

'Rl' සමඟ සරල grep එය සාදන ආකාරය ගැන මා පුදුමයට පත් වෙමි :

grep -rl 'pattern_to_find' /path/where/to/find

-r to recursively find a file / directory inside directories..
-l to list files matching the 'pattern'

රටාව සොයාගත් පෙළෙන් පසුව ගොනු නාම බැලීමට 'l' නොමැතිව '-r' භාවිතා කරන්න !

grep -r 'pattern_to_find' /path/where/to/find

එය පරිපූර්ණව ක්‍රියා කරයි ...


මෙය Git Bash (Windows) හි ද ක්‍රියාත්මක වේ .
පීටර් මෝර්ටෙන්සන්

නමුත් එයින් ගම්‍ය වන්නේ සෑම ගොනුවක්ම සෙවිය යුතු බවයි (ගොනු නාමයේ හෝ ගොනු දිගු කිරීමේ මට්ටමේ පෙරනයක් නැත .txt). නැත්නම් ඒ සඳහා ක්‍රමයක් තිබේද?
පීටර් මෝර්ටෙන්සන්

12

සෙවුම් නූල සමඟ එම පේළිය සහ ප්‍රතිදානය සෙවීම සඳහා:

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;

1
භාවිතයට සාපේක්ෂව අවාසිය පමණක් මා දකිමි find … -exec grep 'str' {} \;(ඔබට findකිසිසේත් භාවිතා කිරීමට සිදුවුවහොත් ).
phk

1
කිසියම් ලිපිගොනු findඅඩංගු අවකාශයක් තිබේ නම් මෙය දරුණු ලෙස බිඳී යනු ඇත .. ඔබට greppingවැරදි ලිපිගොනු අවසන් කළ හැකි අතර / හෝ නිවැරදි ලිපිගොනු මුළුමනින්ම මග හැරෙනු ඇත. ඔබට භාවිතා find ... -exec grep ...කිරීමට අවශ්‍යතාවයක් ඇත්නම් පමණක් භාවිතා කරන්න find.. නමුත් මේ අවස්ථාවේ දී එය grep -r ...ප්‍රමාණවත් වේ.
shalomb

1
සොයා ගැනීමේ ප්‍රති over ලවලට වඩා ලූපයක් භාවිතා කිරීමෙන් ඇති ප්‍රයෝජනය කුමක්ද? මෙය අනවශ්‍ය ලෙස සංකීර්ණ වේ.
fedorqui 'SO හානිය නවත්වන්න'

12

ackඔබ සොයන දේ හරියටම මෙවලමක් තිබේ.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

-iසිද්ධි සංවේදී සෙවීම සඳහා ඔබට නොසලකා හැරිය හැක


2
පවතින පිළිතුරු වලට මෙය එකතු කරන්නේ කුමක් ද? මෙය මීට වසර තුනකට පෙර දැනටමත් යෝජනා කර ඇත.
fedorqui 'SO හානිය නවත්වන්න'

1
edfedorqui 1) නල මාර්ගයක් නැත! 2) නිත්‍ය ප්‍රකාශන භාවිතා කරන්න 3) රේඛා අංක ලබා ගන්න, සාපේක්ෂ මාර්ගය සහිත ගොනු නම, උද්දීපනය කළ පෙළ යනාදිය සෙවීමෙන් පසු සංස්කරණය කිරීම සඳහා ප්‍රයෝජනවත් වේ. උදා: "vim + lineno path / file.cpp" ඔබට උනන්දුවක් නොදක්වන රේඛාවෙන් ඔබව ලබා ගනී. මගේ සෙවුම් ෆෝල්ඩරය සහ උප ෆෝල්ඩර යටතේ සෙවුම් "ඇතුළත්" හෝ "hpp" මූල පද "අක් ඇතුළත් \ | hpp" විධානයේ ප්‍රතිදානය බලන්න. කාරණය පැහැදිලි යැයි මම සිතමි. මෙන්න නියැදි ප්‍රතිදානය (සරල පෙළ සමඟ යතුරුපදයේ උද්දීපනයන් පෙන්විය නොහැක) ක්‍රියාවලිය / child.hpp 11: boost / process / child.hpp process / all.hpp 21: #include <boost / process / execute.hpp>
පල්

12

පෙර සියලුම පිළිතුරු යෝජනා කරන්නේ grep සහ find. නමුත් තවත් ක්‍රමයක් තිබේ: මිඩ්නයිට් කමාන්ඩර් භාවිතා කරන්න

එය නිදහස් උපයෝගීතාවයකි (අවුරුදු 30 ක් පැරණි, කාලය අනුව සනාථ වේ) එය GUI නොවී දෘශ්‍ය වේ. එහි කාර්යයන් ටොන් ගණනක් ඇති අතර ලිපිගොනු සොයා ගැනීම ඒවායින් එකක් පමණි.


රේන්ජර් එකම අදහසකින්
යුක්ත

11

මෙම ප්‍රවේශය සඳහා පහත විධානය හොඳින් ක්‍රියාත්මක වේ:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

2
භාවිතා කිරීමේ තේරුම කුමක්ද? findඑදා සහ grep -r? ඒවා එකම දේ සඳහා අදහස් කරන බැවින් මෙය අතිරික්ත වේ.
fedorqui 'SO හානිය නවත්වන්න'

ඔහ් !! නිවැරදි කරන ලදි, ඇත්ත වශයෙන්ම සොයා ගැනීම පෙරහන් කරන ලද ලිපිගොනු මත ධාවනය කිරීම සඳහා වන අතර සියල්ලම නොවේ, ස්තූතියි
ප්‍රදීප් ගෝස්වාමි

2
තවමත්, මෙය කිසිදු තේරුමක් නැත, ඔබට පෙරහන් කළ හැකිය find.
fedorqui 'SO නවත්වන්න'

11

කරදරයෙන් වැළකී ack-grep ස්ථාපනය කරන්න. එය බොහෝ අවසර සහ උපුටා දැක්වීමේ ගැටළු ඉවත් කරයි.

apt-get install ack-grep

ඉන්පසු ඔබට සෙවීමට අවශ්‍ය නාමාවලිය වෙත ගොස් පහත විධානය ක්‍රියාත්මක කරන්න

cd /
ack-grep "find my keyword"
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.