මම පුනරාවර්තනය වන්නේ කෙසේද?


1695

grepසියලුම නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්නේ කෙසේද ?

find . | xargs grep "texthere" *

111
@ TC1 කනගාටුදායක කාරණය නම්, ග්‍රෙප් විසින්ම ප්‍රශ්නයට පිළිතුරු දිය හැකි වීමයි (අවම වශයෙන් GNU grep): grep --help | grep recursive
Frank Schmitt

7
ඔබ නිතර නිතර ආවර්තනික සෙවුම් කරන්න අයිතිය සුරකියි භාවිතා (ඔබ අතින් ගොනුව / බහලුම exlusions ගොඩක් කරන්න, විශේෂයෙන්ම නම්) ඔබ සොයා නම්, ඔබ විය හැක ack (ඉතා ක්රමලේඛකයෙක් හිතකාමී අයිතිය සුරකියි විකල්ප) ප්රයෝජනවත්.
නික් මැකර්ඩි

20
මම වැඩ කරන ස්ථානයේ භාවිතා කරන සොලාරිස් පෙට්ටියේ ඇත්ත වශයෙන්ම -r හෝ - පුනරාවර්තන වැඩ නැත. Grep සඳහා වන man පිටුවෙහි පුනරාවර්තන කිසිවක් සඳහන් නොවේ. මට මා සොයා ගැනීමට හා සොයා ගැනීමට සිදු විය.
බෙන්

8
ag දැන් මෙය කිරීමට මගේ ප්‍රියතම ක්‍රමය github.com/ggreer/the_silver_searcher
dranxo

1
grep -rin xlsx *.plRedhat Linux හි මා වෙනුවෙන් වැඩ නොකරයි. මට "ගැලපීමක් නැත" දෝෂයක් ඇත.
බල්රෂ්

Answers:


2525
grep -r "texthere" .

පළමු පරාමිතිය සෙවීම සඳහා නිත්‍ය ප්‍රකාශනය නියෝජනය කරන අතර දෙවැන්න සෙවිය යුතු නාමාවලිය නියෝජනය කරයි. මෙම අවස්ථාවේ දී, .වර්තමාන නාමාවලිය අදහස් වේ.

සටහන: මෙය GNU grep සඳහා ක්‍රියා කරන අතර සොලාරිස් වැනි සමහර වේදිකා වලදී ඔබ විශේෂයෙන් උරුමය ක්‍රියාත්මක කිරීමට වඩා GNU grep භාවිතා කළ යුතුය. සොලාරිස් සඳහා මෙය විධානයයි ggrep.


39
සටහන: "grep -r" වැඩ කරන්නේ නවතම greps මත පමණි. AIX 5.3උදාහරණයක් ලෙස එන grep මත එය ක්‍රියා නොකරයි .
අත්හිටුවා

111
සිම්ලින්ක් අනුගමනය කිරීමට grep -R භාවිතා කරන්න.
එලොෆ්

54
"-I" එය සංවේදී නොවන බව දැන ගැනීම හොඳය, සහ "-n" ද ගැලපෙන එක් එක් ප්‍රති .ල සඳහා රේඛා අංකය ඇතුළත් කරයි.
සාඩෙග්

24
ඔබ දැනගෙන සිටීම හොඳය, ඔබ සොයන්නේ ස්ථාවර නූලක් මිස රීජෙක්ස් නොවේ නම්, -F විකල්පය භාවිතා කරන්න. එය රීජෙක්ස් විග්‍රහ කරන්නාට ආයාචනා නොකිරීමෙන් ඔබට කාලය ඉතිරි වේ. ඔබ ලිපිගොනු ගොඩක් සොයන්නේ නම් ඉතා පහසුය.
ජෙෆ්

6
හෙවත් rgrep = 'අයිතිය සුරකියි -r'
totten

685

ඔබ කැමති ගොනුවේ දිගුව හෝ රටාව ඔබ දන්නේ නම්, තවත් ක්‍රමයක් වන්නේ --includeවිකල්පය භාවිතා කිරීමයි :

grep -r --include "*.txt" texthere .

බැහැර කළ යුතු ලිපිගොනු ද ඔබට සඳහන් කළ හැකිය --exclude.

ඇග්

ඔබ නිතරම කේතය හරහා සොයන්නේ නම්, ඇග් (රිදී සෙවුම්කරු) යනු ග්‍රෙප් සඳහා වඩා වේගවත් විකල්පයකි, එය කේත සෙවීම සඳහා රිසිකරණය කර ඇත. නිදසුනක් ලෙස, එය පෙරනිමියෙන් පුනරාවර්තනය වන අතර ලැයිස්තුගත කර ඇති ලිපිගොනු සහ නාමාවලි ස්වයංක්‍රීයව නොසලකා හරිනු ඇත .gitignore, එබැවින් ඔබට ග්‍රහණය කර ගැනීමට හෝ සොයා ගැනීමට එකම කරදරකාරී බැහැර විකල්පයන් පසුකර යාමට අවශ්‍ය නැත.


3
ලිනක්ස් සහ සිග්වින් සමඟ එන ග්‍රෙප් සමඟ විශිෂ්ට ලෙස ක්‍රියා කරයි, නමුත් AIX සමඟ එන ඒවා සමඟ නොවේ.
අත්හිටුවා

1
RKrzysztofWolny: `` වෙනුවට =උබුන්ටු මත හොඳින් ක්‍රියා කරයි. PS: එය පසුගාමී අවකාශයක් විය යුතුයි, නමුත් SO ලකුණු කිරීමේ විග්‍රහකය අසමත් විය.
ඩෑන් ඩස්කල්ස්කු

4
An ඩැන්ඩස්කල්ස්කු මම උසස් වුණේ ඇග් සඳහා නොව grep, ඔබ දන්නා නිසා :)
බර්න්හාර්ඩ්

1
පුනරාවර්තව සෙවීමේදී නාමාවලිය බැහැර කිරීමට අපට විකල්පයක් තිබේද?
ටොම් ටේලර්

වින්ඩෝස් සිග්වින් ද්විත්ව උපුටා දැක්වීම් වලට කැමතියි--include "*.txt" --include "*.TXT"
බොබ් ස්ටේන්

129

තවද:

find ./ -type f -print0 | xargs -0 grep "foo"

නමුත් grep -rවඩා හොඳ පිළිතුරකි.


14
නැතහොත් ඔබට ගොනු නාමවල ඇති අවකාශයන් ගැන කරදර වීමට අවශ්‍ය නැතිනම් find . -type f -exec grep "foo" '{}' \;සහය දක්වන තැන හොඳින් ක්‍රියා කරයි.
එඩ් ස්ටීල්

4
ඔබ xargs හරහා grep වෙත නල මාර්ගයක් සොයා ගැනීමට යන්නේ නම්, සහ ඔබ ස්ථාවර නූලක් පමණක් සොයන්නේ නම් (එනම්, රීජෙක්ස් නොවේ), ඔබට grep -F විකල්පය යෙදීමෙන් ප්‍රයෝජන ලැබිය හැකිය, එබැවින් grep රීජෙක්ස් එන්ජිම පටවන්නේ නැත එක් එක් ආයාචනය සඳහා. ලිපිගොනු විශාල ප්‍රමාණයක් තිබේ නම් එය වඩා වේගවත් වනු ඇත.
ජෙෆ්

2
සොයා ගන්න. -type f -exec grep -Hu "foo" {} \; එය ගොනු නාමය ලබා දෙන බැවින් මම භාවිතා කරමි.
වෙස්

මෙය සියලුම * නික්ස් වල ක්‍රියාත්මක වන්නේ එය POSIX 7
Ciro Santilli 郝海东 冠状 六四 法轮功 法轮功

1
find ./ -type f -print0 | xargs -0 grep "foo"
aehlke

118

මම දැන් සෑම විටම භාවිතා කරමි (වින්ඩෝස් හි GoW - Gnu සමඟ වින්ඩෝස් වල පවා ):

grep --include="*.xxx" -nRHI "my Text to grep" *

එයට පහත විකල්ප ඇතුළත් වේ:

--include=PATTERN

නාමාවලි වල පුනරාවර්තනය ගොනු ගැලපීම සෙවීම පමණි PATTERN.

-n, --line-number

එක් එක් නිමැවුම් පේළිය එහි ආදාන ගොනුව තුළ ඇති රේඛා අංකය සමඟ උපසර්ගය කරන්න.

(සටහන: phuclv එකතු අදහස් බව -nඑසේ කාර්ය සාධන ගොඩක් අඩු , එසේ ඔබ එම විකල්පය මඟ කිරීමට ඔබට අවශ්ය විය හැකිය)

-R, -r, --recursive

එක් එක් නාමාවලිය යටතේ ඇති සියලුම ලිපිගොනු පුනරාවර්තනයෙන් කියවන්න; මෙය -d recurseවිකල්පයට සමාන වේ .

-H, --with-filename

සෑම තරඟයක් සඳහාම ගොනු නාමය මුද්‍රණය කරන්න.

-I     

ද්විමය ගොනුවක් ගැලපෙන දත්ත අඩංගු නොවන ආකාරයට සකසන්න;
මෙය --binary-files=without-matchවිකල්පයට සමාන වේ .

මට සිද්ධි සංවේදී නොවන ප්‍රති .ල අවශ්‍ය නම් මට ' i' ( -nRHIi) එකතු කළ හැකිය .

මට ගන්න පුළුවන්:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

ගෝව් බලාපොරොත්තු සහගතයි - මා භාවිතා කළ ග්නූ වින්ඩෝස් උපයෝගිතා වලට වඩා නව. දැන් එය උත්සාහ කරමින් ...
රදීම් සර්නෙජ්

මෙහි අවසාන චරිතයේ තේරුම කුමක්ද?
ලෝර්නිපර්

2
@lorniper මඟින් එය ඔබගේ වත්මන් නාමාවලියෙහි ඇති සියලුම ලිපිගොනු සහ ෆෝල්ඩර තෝරා ගැනීමට ෂෙල්ට ඉඩ සලසයි -R.
VonC

2
ornlorniper Noy හරියටම: *හෝ ග්ලෝබ් .රටාවකි (කවචය මගින් අර්ථ නිරූපණය කෙරේ): unix.stackexchange.com/a/64695/7490 . ' .' විසින් තිත් ගොනු හෝ තිත් ෆෝල්ඩරද තෝරා ගනු ඇත (වැනි .git/)
VonC

මීට පෙර මම සැමවිටම භාවිතා කර ඇති grep -rnIනමුත් පසුව මම ඉගෙන ගත්තා -nකාර්ය සාධනය බොහෝ සෙයින් අඩු වන නිසා මම එය ඇත්ත වශයෙන්ම අවශ්‍ය විටදී භාවිතා කරන අතර සාමාන්‍යයෙන් මම භාවිතා කරමි-rI
phuclv

25

POSIX පද්ධති වලදී, ඔබට -rපරාමිතිය සොයාගත නොහැකි grepඅතර ඔබ grep -rn "stuff" .ක්‍රියාත්මක නොවනු ඇත, නමුත් ඔබ findවිධානය භාවිතා කරන්නේ නම්:

find . -type f -exec grep -n "stuff" {} \; -print

එකඟ විය Solarisසහ HP-UX.


{} of හි තේරුම කුමක්ද; පිළිවෙලින් මුද්‍රණය?
user1169587

3
දී -execවිකල්පය - සංකේතය {}විසින් දැනට සොයා ගත් ගොනු නාමය කිරීමට සඳහනක් findමෙවලමක් (අපි සොයා ගොනු නාමය යමක් බව), ද -execවිකල්පය සමඟ අවසන් කළ යුතුයි ;සංකේතය (මෙම exec විධාන අවසන් නිමිත්තෙන්), නමුත් මේ සියල්ල නිසා ෂෙල් එකක ධාවනය වන සංකේතය ගැලවී යා යුතුය .. අවසාන වශයෙන් -printවිකල්පය මඟින් findසොයාගත් ගොනු නාමයන් තිරයේ මුද්‍රණය කිරීමට ඉඩ දෙයි .
rook

19

ග්ලෝබින් **

grep -rකෘති භාවිතා කිරීම, නමුත් එය විශාල ෆෝල්ඩර වල අධික ලෙස මරණයට පත් විය හැකිය.

වඩාත් ප්‍රායෝගික භාවිතය සඳහා, ග්ලෝබින් සින්ටැක්ස් ( **) භාවිතා කරන සින්ටැක්ස් මෙන්න :

grep "texthere" **/*.txt

රටා තෝරාගත් රටාව සහිත විශේෂිත ලිපිගොනු පමණක් ග්‍රහණය කරයි. එය Bash +4 හෝ zsh වැනි ආධාරක කවච සඳහා ක්‍රියා කරයි .

මෙම අංගය සක්‍රිය කිරීමට, ධාවනය කරන්න : shopt -s globstar.

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

git grep

Git අනුවාද පාලනය යටතේ ඇති ව්‍යාපෘති සඳහා, භාවිතා කරන්න:

git grep "pattern"

එය වඩා ඉක්මන් වේ.

ripgrep

විශාල ව්යාපෘති සඳහා, ඉක්මන්ම අඹරන මෙවලම වේ ripgrep පෙරනිමියෙන් ලිපිගොනු පුනරාවර්තනය කිරීමයි:

rg "pattern" .

සෙවීම ඉතා වේගවත් කිරීම සඳහා සීමිත ස්වයංක්‍රීය, සිම්ඩ් සහ ආක්‍රමණශීලී වචනාර්ථමය ප්‍රශස්තිකරණ භාවිතා කරන රස්ට්ගේ රීජෙක්ස් එන්ජිමට ඉහළින් එය ඉදිකර ඇත . පරීක්ෂා කරන්න මෙතන සවිස්තර විශ්ලේෂනයක් .


3
Git grep යෝජනාවට ස්තූතියි - එය ඉතා ප්‍රයෝජනවත් වන අතර මම ඒ ගැන දැන සිටියේ නැත!
බස්යා

2
රිප්ග්‍රෙප් යෝජනාවට ස්තූතියි. එය වේගවත් ය.
සිසිල් වන්නේ කුමක් ද?

11

නම සොයා ගැනීමට filesසමග pathඇත්තෙන් වෙනසට භාජනය වූ සුවිශේෂ අඩංගු stringවිධාන පහත භාවිතය UNIX:

find . | xargs grep "searched-string"

සඳහා Linux:

grep -r "searched-string" .

UNIXසේවාදායකයේ ගොනුවක් සොයා ගන්න

find . -type f -name file_name

LINUX සේවාදායකයේ ගොනුවක් සොයා ගන්න

find . -name file_name

11

ගොනු නාමයන්ද ප්‍රයෝජනවත් වේ

grep -r -l "foo" .

10

ඔබට අවශ්‍ය වන්නේ සංකේතාත්මක සබැඳි නොව සත්‍ය නාමාවලි පමණක් අනුගමනය කිරීමට නම්,

grep -r "thingToBeFound" directory

ඔබට සංකේතාත්මක සබැඳි මෙන්ම සත්‍ය නාමාවලි අනුගමනය කිරීමට අවශ්‍ය නම් (අනන්ත පුනරාවර්තනයෙන් ප්‍රවේශම් වන්න),

grep -R "thing to be found" directory

ඔබ පුනරාවර්තනය වීමට උත්සාහ කරන බැවින්, පහත දැක්වෙන විකල්පයන් ද ඔබට ප්‍රයෝජනවත් විය හැකිය:

-H: outputs the filename with the line

-n: outputs the line number in the file

එබැවින් වත්මන් නාමාවලියෙහි හෝ ඕනෑම උප බහලුමක ඩාර්ත් වඩර් අඩංගු සියලුම ලිපිගොනු සොයාගෙන ගොනු නාමය සහ රේඛා අංකය ග්‍රහණය කර ගැනීමට ඔබට අවශ්‍ය නම්, නමුත් පුනරාවර්තනය සංකේතාත්මක සබැඳි අනුගමනය කිරීමට අවශ්‍ය නොවන්නේ නම්, විධානය වනුයේ

grep -rnH "Darth Vader" .

ඔබට නාමාවලියෙහි බළලා යන වචනයේ සියලුම සඳහන සොයා ගැනීමට අවශ්‍ය නම්

/home/adam/Desktop/TomAndJerry 

ඔබ දැනට නාමාවලියෙහි සිටී

/home/adam/Desktop/WorldDominationPlot

ඔබට අවශ්‍ය වන්නේ ගොනු නාමය අල්ලා ගැනීමට මිස "බළලුන්" නූලෙහි ඕනෑම අවස්ථාවක රේඛා අංකය නොව, පුනරාවර්තනය සංකේතාත්මක සබැඳි සොයා ගන්නේ නම් ඒවා අනුගමනය කිරීමට ඔබට අවශ්‍ය නම්, ඔබට පහත සඳහන් ඒවායින් එකක් හෝ ධාවනය කළ හැකිය

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

මූලාශ්රය:

"grep --help" ධාවනය

සංකේතාත්මක සබැඳි පිළිබඳ කෙටි හැඳින්වීමක්, මෙම පිළිතුර කියවන සහ ඒවා පිළිබඳ මගේ සඳහනෙන් ව්‍යාකූල වන ඕනෑම කෙනෙකුට: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


නියම පිළිතුර. අමතර ස්විචයන් (-rnh) ඉතා ප්‍රයෝජනවත් වේ, එබැවින් ඒවා යෝජනා කිරීමට ස්තූතියි.
semtex41

8

ag දැන් මෙය කිරීමට මගේ ප්‍රියතම ක්‍රමය github.com/ggreer/the_silver_searcher . එය මූලික වශයෙන් අක්ක් හා සමාන වන නමුත් තවත් ප්‍රශස්තිකරණ කිහිපයක් සමඟ.

මෙන්න කෙටි මිණුම් ලකුණක්. සෑම පරීක්ෂණයකටම පෙර මම හැඹිලිය ඉවත් කරමි (cf /ubuntu/155768/how-do-i-clean-or-disable-the-memory-cache )

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s


6

ඔබ ඩිරෙක්ටරි ව්‍යුහයකින් සියලුම ලිපිගොනු වල නිශ්චිත අන්තර්ගතයක් සොයන්නේ නම්, ඔබ කරන්නේ findකුමක්ද යන්න වඩාත් පැහැදිලි බැවින් ඔබට භාවිතා කළ හැකිය :

find -type f -exec grep -l "texthere" {} +

-l(L හි පහළ කොටස) පෙළ අඩංගු ගොනුවේ නම පෙන්වන බව සලකන්න . ඔබට ඒ වෙනුවට තරගය මුද්‍රණය කිරීමට අවශ්‍ය නම් එය ඉවත් කරන්න. නැතහොත් -Hතරගය සමඟ ගොනුව ලබා ගැනීමට භාවිතා කරන්න. සියල්ල එකට ගත් විට, වෙනත් විකල්ප:

find -type f -exec grep -Hn "texthere" {} +

කොහෙද -nරේඛාව අංකය මුද්රණය කරයි.


2
එකම වීම සඳහා-ඡන්දය findපිළිබඳ වැලැක්විමට අනවශ්ය භාවිතය දෙකටම විසඳුම xargsහා භාවිතය +වෙනුවට \;සමග -execඑමගින් අනවශ්ය ක්රියාවලිය දියත් ටොන් වැළකී. :-)
ShadowRanger

6

මගේ වර්තමාන යන්ත්‍රයේ මගේ නඩුව සඳහා වැඩ කළේ මෙයයි (වින්ඩෝස් 7 හි git bash):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

අවකාශයන් සහිත මාර්ග සඳහා -print0 සහ -0 මට සැමවිටම අමතක වේ.

සංස්කරණය කරන්න: මගේ ප්‍රියතම මෙවලම දැන් ripgrep: https://github.com/BurntSushi/ripgrep/releases . එය සැබවින්ම වේගවත් වන අතර වඩා හොඳ පෙරනිමි ඇත (පෙරනිමියෙන් පුනරාවර්තනය වැනි). මගේ මුල් පිළිතුරට සමාන උදාහරණයක් නමුත් ripgrep භාවිතා කිරීම:rg -g "*.cs" "content pattern"


4

grep -r "texthere" . (දැනුම් දීමේ කාලය අවසානයේ)

(^ ණය: https://stackoverflow.com/a/1987928/1438029 )


පැහැදිලි කිරීම:

grep -r "texthere" /( සියලු නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්න )

grep -r "texthere" .( මෙම නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්න )

grep පුනරාවර්තන

grep [options] PATTERN [FILE...]

[විකල්ප]

-R, -r, --recursive

එක් එක් නාමාවලිය යටතේ ඇති සියලුම ලිපිගොනු පුනරාවර්තනයෙන් කියවන්න.

මෙය -d recurseහෝ --directories=recurseවිකල්පයට සමාන වේ .

http://linuxcommand.org/man_pages/grep1.html

grep උදව්

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

විකල්ප

ack( http://beyondgrep.com/ )

ag( http://github.com/ggreer/the_silver_searcher )


4

2018 දී, ඔබට භාවිතා කිරීමට අවශ්ය ripgrepහෝ the-silver-searcherඒවා විකල්පයන්ට වඩා වේගවත් නිසා.

පළමු මට්ටමේ උප බහලුම් 336 ක් සහිත නාමාවලිය මෙන්න:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

OSX හි, මෙය ස්ථාපනය කරයි ripgrep: brew install ripgrep. මෙය ස්ථාපනය කරයි silver-searcher: brew install the_silver_searcher.


ඔබට මෙය බොහෝ විට කිරීමට අවශ්‍ය නම් වේගය වැදගත් වේ, නමුත් අපගෙන් බොහෝ දෙනෙක් මෙය කරන්නේ වසරකට කිහිප වතාවක් පමණි. නවතම තුන්වන පාර්ශවීය ජුජු මෙවලම ඩු ජෝර් ස්ථාපනය කිරීම අධික ලෙස මරා දමා ඇති අතර 1978 සිට බොහෝ වෙනස් වී නැති විසඳුම් නොසලකා දැන ගැනීම හොඳය.
ත්‍රිත්ව

ක්‍රමලේඛකයෙකු වසරකට කිහිප වතාවක් පමණක් ප්‍රභව ගසක පෙළ සෙවීම අතිශයින්ම විශ්වාස කළ නොහැකි බව මට පෙනේ. නමුත් භාවිතයේ දෘෂ්ටි කෝණයෙන් වුවද, rgමුල සිටම පුනරාවර්තන grep විධානයක් එකට එකතු කිරීම සම්බන්ධයෙන් සැලකිය යුතු සීමාවක් ඇත. භාවිතා කිරීම rg: rg foo. යුනික්ස් මෙවලම් භාවිතා කිරීම : find . | xargs grep foo. ඔබගේ ඕනෑම ගොනුවක එහි උපුටා දැක්වීමක් තිබේ නම්, ඔබ භාවිතා කළ find . -print0 | xargs -0 grep fooයුතුය. ඔබ මෙය වසරකට කිහිප වතාවක් භාවිතා කරන්නේ නම් ඔබට මතකද?
hughdbrown

1
ඔබ find . -type f -exec grep 'regex' {} +මෙම මෙවලම් කිසියම් විධිමත්භාවයකින් භාවිතා කරන්නේ නම් මතක තබා ගැනීම පහසුය. ඔබට නිතර දේවල් සොයා ගැනීමට අවශ්‍ය නම් ඔබ කෙසේ ctagsහෝ ධාවනය කළ යුතුය etags.
ත්‍රිත්ව

මම ripgrep භාවිතා කර ඇති අතර එය විශිෂ්ටයි. නමුත් රිදී සෙවුම් ක්‍රමලේඛකයින් සඳහා අතිශය අසාමාන්ය ය. +1
මතෙ

3

මගේ IBM AIX සේවාදායකයේ (OS අනුවාදය: AIX 5.2), භාවිතා කරන්න:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

මෙය ගොනුවේ මාර්ගය / ගොනු නම සහ සාපේක්ෂ රේඛා අංකය මුද්‍රණය කරයි:

./inc/xxxx_x.h

2865: / ** විස්තරය: stringYouWannaFind * /

කෙසේ වෙතත්, එය මට වැඩ කරයි :)


3

පහත දැක්වෙන්නේ Stringපුනරාවර්තන ලෙස Unixහා Linuxපරිසරය සෙවීමේ විධානයයි .

සඳහා UNIXවන විධානය:

find . -name "string to be searched" -exec grep "text" "{}" \;

සඳහා Linuxවන විධානය:

grep -r "string to be searched" .

2

පවතින ධජ ලැයිස්තුවක් සඳහා:

grep --help 

අනුරූප රේඛා අංකය සමඟ වත්මන් නාමාවලියෙහි රීජෙක්ස් පෙළ සඳහා සියලු ගැලපීම් ලබා දෙයි :

grep -rn "texthere" .

මූල ඩිරෙක්ටරියේ සිට අනුරූප රේඛා අංකය සහ නොසලකා හැරීමේ නඩුව සමඟ පෙළ සඳහා සියලු ගැලපීම් ලබා දෙයි :

grep -rni "texthere" /

මෙහි භාවිතා කරන ධජ:

  • -r පුනරාවර්තන
  • -n ප්‍රතිදානය සමඟ රේඛා අංකය මුද්‍රණය කරන්න
  • -i නඩුව නොසලකා හරින්න

2

මගේ ශත දෙක මෙතනට විසි කරනවා. අනෙක් අය දැනටමත් සඳහන් කර ඇති පරිදි grep -r සෑම වේදිකාවකම ක්‍රියා නොකරයි. මෙය මෝඩකමක් ලෙස පෙනුනත් මම නිතරම git භාවිතා කරමි.

git grep "texthere"

නාමාවලිය වේදිකාගත නොවුනත්, මම එය වේදිකා ගත කර git grep භාවිතා කරමි.


1

මම හිතන්නේ ඔබ ලිවීමට උත්සාහ කරන්නේ මෙයයි

grep myText $(find .)

ඔබට grep පහරක් ඇති ගොනු සොයා ගැනීමට අවශ්‍ය නම් මෙය වෙනත් ප්‍රයෝජනවත් දෙයක් විය හැකිය

grep myText $(find .) | cut -d : -f 1 | sort | uniq

එය ඉතා බුද්ධිමත් ය: උදාහරණයක් ලෙස: grep -i acc $ (සොයා ගන්න.-නම "ක්‍රියාත්මක කිරීම *. *")
යූ ෂෙන්

0

එය සටහන් කර ගන්න find . -type f | xargs grep whateverසොයාගැනීම් හා ගැලපෙන ලිපිගොනු විශාල ප්‍රමාණයක් ඇති විට, විවිධාකාර විසඳුම් "තර්ක ලැයිස්තුවට දිගු" දෝෂ වලට වැටෙන .

හොඳම ඔට්ටුව grep -rනමුත් එය ලබා ගත නොහැකි නම් ඒ find . -type f -exec grep -H whatever {} \;වෙනුවට භාවිතා කරන්න.


හහ්? xargsවිශේෂයෙන් "තර්ක ලැයිස්තුව දිගු" ගැටළුව සඳහා වන විසඳුමකි.
ත්‍රිත්ව

2
හොඳයි, නෑ - xargs වේ විශේෂයෙන් ක arglist කිරීමට තර්ක ක නල බවට පත් කිරීම සඳහා වූ, නමුත්, ඔව්, එය නූතන xargs බව සැබෑ ය -s සහ / හෝ -L සමග භාවිත කරන විට බහු විධාන යාතිකා බිඳ විසින් ඉතා දිගු arglists සමග ගනුදෙනු කළ හැකි, නමුත් එය පෙරනිමියෙන් වින්‍යාස කර නොමැත (සහ ඉහත කිසිදු ප්‍රතිචාරයක එය නොතිබුණි). උදාහරණයක් ලෙස:find . -type f | xargs -L 100 grep whatever
m.thome

එය ක්‍රියාත්මක වන්නේ කුමන වේදිකාවේද? මෙම හැසිරීම කොටුවෙන් පිටත තබා ගැනීම සඳහා POSIXxargs ප්‍රමිතිකරණය කර ඇත. " xargsවිධාන රේඛාව ආයාචනය කරන විට, ඒකාබද්ධ තර්කය සහ පරිසර ලැයිස්තු ... {ARG_MAX} -2048 බයිට් නොඉක්මවන පරිදි උපයෝගීතාව විධාන රේඛාවේ දිග සීමා කරයි."
ත්‍රිත්ව

හ්ම්. මෙම පදනම මත ග්නූ ඩොක්ස් පොසික්ස් වලට වඩා අඩු පැහැදිලි බවක් ඇති අතර, මෙම ප්‍රකාශය කිරීමට හේතු වූ යන්ත්‍රයට මට තවදුරටත් ප්‍රවේශයක් නොමැති අතර, දැනට ක්‍රියාත්මක වන ඕනෑම ක්‍රියාවලියක් පිළිබඳ මගේ මුල් අර්ථ නිරූපණය තහවුරු කළ නොහැක. පුනරාවර්තන grep ලබා ගත හැකි නම් තවමත් යෝග්‍ය වේ, නමුත් xargs වට්ටෝරුව වළක්වා ගැනීමට එතරම් හේතුවක් නැත (grep සඳහා අවසාන ආයාචනය වළක්වා ගැනීම සඳහා grep සඳහා -H භාවිතා කරන්න, නමුත් එක් ගොනු නාමයක් පමණක් සම්මත වුවද).
m.thome

0

විනෝදය සඳහා, rist ක්‍රිස්ටැන්ග්‍රන්ට් පිළිතුර ටයිප් කිරීමට නොහැකි නම් * .txt ලිපිගොනු ඉක්මන් හා අපිරිසිදු සෙවීමක් :-)

grep -r texthere .|grep .txt


0

දී ඇති ෆෝල්ඩරයක ($ 1) සියළුම උප ෆෝල්ඩර හරහා ගමන් කරන පුනරාවර්තන (බාෂ් සහ ෂා සමඟ සැහැල්ලුවෙන් පරීක්ෂා කර ඇත) සහ grepලබා දී ඇති ලිපිගොනු ($ 2) සඳහා ලබා දී ඇති නූල් ($ 3) සඳහා සෙවීම් භාවිතා කරයි :

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

එය ක්‍රියාත්මක කිරීම සහ නිදර්ශන ප්‍රතිදානය:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

-2
The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .

7
මෙය වෙනත් පිළිතුරු වලට වැඩි යමක් එකතු නොකරයි
මෙල්
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.