Find -exec ධාවනය කරන්නේ කෙසේද?


548

"ඩිරෙක්ටරියේ" "ක්‍රෝම්" පෙළ අඩංගු ලිපිගොනු සොයා ගැනීමට මම කැමතියි.

$ find . -exec grep chrome
find: missing argument to `-exec'

මම වැරදි කරන්නේ කුමක් ද?



මට ලැබුණාfind: Only one instance of {} is supported with -exec ... +
කොස්ටා

Answers:


813

ඔබට ;( \;ෂෙල් එක අර්ථ නිරූපණය කිරීමෙන් වලක්වා ගැනීම සඳහා මෙහි පැන ගොස් ඇත ) හෝ a +සහ a {}:

find . -exec grep chrome {} \;

හෝ

find . -exec grep chrome {} +

findක්‍රියාත්මක වන grepඅතර {}සොයාගත් ගොනු නාම (ය) සමඟ ආදේශ කරනු ඇත . අතර වෙනස ;සහ +ඒ සමඟ ;තනි grepඑක් එක් ගොනුව සඳහා විධානය සමඟ ඇති ෙහයින්ද ක්රියාත්මක වන +බොහෝ ගොනු කළ හැකි ලෙස පරාමිතීන් ලෙස ලබා දී ඇත ලෙස grepඑකවර.


34
ඔබ use භාවිතා කරන්නේ නම්; අවසන් ඉදිකිරීම් grep වරකට එක් ගොනුවක් සම්මත කරයි, එබැවින් එය පෙරනිමියෙන් ගොනුවේ නම පෙන්වන්නේ නැත, ගැලපෙන රේඛා පමණි. ගොනු ලැයිස්තුවක් ලබා ගැනීම සඳහා grep -lsසොයා ගැනීමේ ඉදිකිරීම් ඇතුළත භාවිතා කරන්න .
කාලෙබ්

13
find . -exec grep foo {} +මේ ආකාරයට ප්‍රතිදානය ඔබට පෙන්වනු ඇත./dir/file.py:from foo import bar
sg

14
find . -exec grep foo {} \;මේ ආකාරයට ප්‍රතිදානය ඔබට පෙන්වනු ඇතfrom foo import bar
sg

12
find . -exec grep -l foo {} +මේ ආකාරයට ප්‍රතිදානය ඔබට පෙන්වනු ඇත./dir/file.py
sg

11
find . -exec grep -l foo {} \;මේ ආකාරයට ප්‍රතිදානය ඔබට පෙන්වනු ඇත./dir/file.py
sg

52

මේ සඳහා ඔබ කිසිසේත් භාවිතා කිරීමට අවශ්‍ය නැත find; වත්මන් නාමාවලියෙහි ඇති සියල්ල පිළිබඳ ගෝලීය ලැයිස්තුවකින් ගොනු විවෘත කිරීම හැසිරවීමට grep හට හැකිය:

grep chrome *

... හෝ ෆෝල්ඩරය සහ එය යටතේ ඇති සියල්ල සඳහා පුනරාවර්තන ලෙස:

grep chrome . -R

22
ප්‍රසාරණය ARG_MAX ඉක්මවා ගියහොත් grep යටපත් වේ. -R සෑම දෙයක්ම නැරඹීමට යන අතර සමහර ලිපිගොනු (-name, ආදිය) බැහැර කිරීම සඳහා ප්‍රාථමිකයන් පහසුවෙන් එකතු කළ හැකිය.
මෙල්

6
හොඳ ලකුණු el මෙල්. මගේ අදහස නම්, ඉල්ලන පාර්ශවය එම කාර්යය findකළ grepහැකි වේලාවට හඳුන්වා දීමෙන් ඔවුන්ට අවශ්‍ය ප්‍රමාණයට වඩා සංකීර්ණ කාරණා සෑදීමයි , නමුත් සමහර අවස්ථාවලදී පිටතට යාමට පෙර ලිපිගොනු ලැයිස්තුව සකස් කිරීම සඳහා සොයා ගැනීම භාවිතා කිරීම වඩාත් be ලදායී වනු ඇත. grep කිරීමට.
කාලෙබ්

4
El මෙල් grepඑවැනි අවස්ථාවක හුස්ම හිර කරන්නේ නැත exec.
ක්‍රිස් ඩවුන්

සියලුම ලිපිගොනු එකම බහලුමක තිබේ නම් පමණක් ක්‍රියා කරයි, ඒවා උප බහලුම් පුරා පැතිරී ඇති විට නොවේ.
යබා

3
Ab යබා මගේ පිළිතුරෙහි සඳහන් වන්නේ උප බහලුම් හරහා පැතිරී ඇති ලිපිගොනු සම්බන්ධව කටයුතු කරන්නේ කෙසේද යන්නයි.
කාලෙබ්

19
find . | xargs grep 'chrome'

ඔබට ද කළ හැකිය:

find . | xargs grep 'chrome' -ls

පළමුවැන්න ඔබට ලිපිගොනු වල පේළි පෙන්වයි, දෙවැන්න ගොනු ලැයිස්තුගත කරයි.

කාලෙබ්ගේ විකල්පය පිළිවෙළකට, යතුරු එබීම් අඩුයි.


12
ගැටළුව xargsවන්නේ එහි ආදානය findනිෂ්පාදනය නොකරන සුවිශේෂී ආකාරයකින් උපුටා දැක්වීම අපේක්ෂා කිරීමයි . ඒ නිසා find … | xargs …ඔබ whitespace අඩංගු හෝ ගොනු නම් ඇති නම් වැඩ නැහැ \'".
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

3
Il ගිල්ස් වැනි දෙයක් භාවිතා කිරීමෙන් ඔබට එම ගැටළුව මඟහරවා ගත හැකි වන අතර find . | xargs -n1 -iX grep "X" 'chrome'එමඟින් තර්ක එකවර පෝෂණය කර උපුටා දැක්විය හැකිය. නිසැකවම මෙය මෙම උදාහරණය හැසිරවීමට දරුණු ලෙස අකාර්යක්ෂම ක්‍රමයක් වන නමුත් සමහර අවස්ථාවල එය හොඳයි.
කාලෙබ්

සම්පුර්ණත්වය සඳහා අපි 'grep' සමඟ සිද්ධි සංවේදීතාව සඳහා -i විකල්පය ද සඳහන් කළ යුතුය. සිද්ධි සංවේදීතාව සඳහා සොයා ගැනීමට -iname ඇත.
මැතිව්

10
Ale කාලෙබ්: xargsලිනක්ස් ගොනු නාම සමඟ කටයුතු කිරීමට ඇති එකම 100% විශ්වාසදායක ක්‍රමය නම් find ... -print0 | xargs -0, NUL බෙදුම්කරු ලෙස භාවිතා කිරීමයි. විකල්ප - xargs -d '\n'නව රේඛාව බෙදුම්කරු ලෙස භාවිතා කිරීම, 99% විශ්වසනීයත්වය.
user1686

මම මෙය බොහෝ විට භාවිතා කරමි, නමුත් එය ගොනු නාම ලැයිස්තුවක් සඳහා අසමත් වනු ඇත, එම අවස්ථාවේදී -exec ජයග්‍රාහකයා බවට පත්වේ.
ස්පේස්මූස්

7

සොයා ගැනීම එක් ක්‍රමයක් වන අතර ඔබට උත්සාහ කළ හැක්කේ ඔබට කළ the_silver_searcherයුත්තේ පමණි

ag chrome

එය සියලුම ලිපිගොනු වල ක්‍රෝම් සොයනු ඇත (උප නාමාවලි ඇතුළත් කරන්න) එය සොයා ගැනීමට වඩා වේගවත් වේ


IMHO විසින් කාර්යය වේගයෙන් සිදු කරන pt (ප්ලැටිනම් සෙවුම්, github.com/monochromegane/the_platinum_searcher වෙතින් ලබා ගත හැකිය ) ද ඇත - ලිපිගොනු කිහිපයක් පමණක් තිබේ නම් එය වැදගත් නොවේ.
බනිස්

5

මෙන්න මම සාමාන්‍යයෙන් find / exec භාවිතා කරන ආකාරය පිළිබඳ උදාහරණයක් ...

find  . -name "*.py" -print -exec fgrep hello {} \;

මෙය සියලුම .py ගොනු සඳහා පුනරාවර්තව සොයනු ඇති අතර, එක් එක් ලිපිගොනු සඳහා ගොනු නාමය මුද්‍රණය කර ඇති අතර (එක් එක්) ගොනුවේ 'හෙලෝ' සඳහා fgrep ගේ. ප්‍රතිදානය පෙනේ (අද දින එකක් ධාවනය කර ඇත):

./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"

1
ඔබගේ කාර්ය ප්‍රවාහය අවුල් කිරීමට නොවේ, නමුත් ඔබ කැමති විය හැකිය: find . -name "*.py" -exec fgrep -l hello {} \; - එය ගැලපෙන ලිපිගොනු වල නම් මුද්‍රණය කරනු ඇත, වෙන කිසිවක් නැත
ජෙෆ් ෂලර්

3

රේඛා වෙනුවට ලිපිගොනු ලැයිස්තුව බැලීමට:

grep -l "chrome" *

හෝ:

grep -r -l "chrome" .
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.