.Gz ගොනු හරහා මම පුනරාවර්තනය වන්නේ කෙසේද?


144

අමු .eml .gz ගොනු වලට සම්පීඩනය කරන මගේ ජීමේල් පණිවිඩ නිතිපතා බාගත කිරීම සඳහා මම ස්ක්‍රිප්ට් එකක් භාවිතා කරමි. ස්ක්‍රිප්ට් සෑම දිනකම ෆෝල්ඩරයක් නිර්මාණය කරයි, ඉන්පසු සෑම පණිවිඩයක්ම තමන්ගේම ගොනුවකට සම්පීඩනය කරයි.

මෙම ලේඛනාගාරය හරහා "නූලක්" සෙවීමට මම කැමතියි.

ග්‍රෙප් පමණක් එය කරන බවක් නොපෙනේ. මම SearchMonkey ද උත්සාහ කළෙමි.


18
use zgrep:zgrep - search possibly compressed files for a regular expression
Arkadiusz Drabczyk

Answers:


155

වත්මන් නාමාවලියෙහි ඇති සියලුම .eml.gz ගොනු නැවත නැවත ලබා ගැනීමට ඔබට අවශ්‍ය නම්, ඔබට මෙය භාවිතා කළ හැකිය:

find . -name \*.eml.gz -print0 | xargs -0 zgrep "STRING"

*කවචය එය අර්ථ නිරූපණය නොකරන පරිදි ඔබ පළමුව පැන යා යුතුය. -print0සොයාගත් සෑම ගොනුවකටම පසු ශුන්‍ය අක්ෂරයක් මුද්‍රණය කිරීමට සොයා ගනී; xargs -0සම්මත ආදානයෙන් කියවන අතර එක් එක් ගොනුව සඳහා විධානය ක්‍රියාත්මක කරයි; zgrepමෙන් ක්‍රියා කරයි grep, නමුත් පළමුව ගොනුව සම්පීඩනය කරයි.


3
'-print0' සහ '-0' අනිවාර්ය නොවේ. xargs පෙරනිමියෙන් '\ n' භාවිතා කරයි.
ජයිම් එම්

1
මාර්ගවල අවකාශ අක්ෂර තිබිය හැකි නම් ඒවා අවශ්‍ය වේ; ඒවා භාවිතා නොකිරීමට සංකීර්ණත්වය හැර වෙනත් හේතුවක් නැත.
ඩැනියෙල් ග්‍රිස්කොම්

2
zgrepgrepසම්පීඩිත නොවන ගොනු ධාවනය කිරීමට වඩා වේගවත් බව පෙනේ . සම්පීඩිත ලිපිගොනු HD වලින් කියවා HD වලින් සම්පීඩිත නොවන ගොනුවක් කියවීමට වඩා වේගයෙන් දිරාපත් විය හැකි බැවිනි.
ජෙරමියා

1
A ජයිම්. පෙරනිමියෙන් හිස් (සුදු අවකාශය) xargsභාවිතා කරයි . නිසැකවම, ලිපිගොනු වල කිසි විටෙක නව රේඛා නොමැත, නමුත් අවකාශයන් නොදැනේ (බොහෝ යුනික්සි වර්ග ඒවා මත පැටලී තිබුණත්). එයින් කියැවෙන්නේ, ඔබට වඩාත් පහසුවෙන් සුදු අවකාශය ගැන කරදර නොවී සරල කළ හැකි ය: එය දියත් කිරීමකට සමාන තර්ක රාශියක් , / සහ ආරක්ෂාව , සහ සියල්ල අතිරේක ක්‍රියාවලියක් දියත් කිරීම සහ නල මාර්ගයක් නොමැතිව සහ තරමක් සංක්ෂිප්තව ලබා ගනී. POSIX සමඟ නිශ්චිතව දක්වා ඇති බැවින් එය මගේ දැනුමට අනුව බොහෝ මෑත කාලීන යුනික්ස් වැනි පද්ධති මත විය යුතුය. find . -name '*.eml.gz' -exec zgrep "STRING" {} +xargs-print0-0-exec+
ෂැඩෝ රේන්ජර්

@ ජරෙඩ් වයිල්ඩ් කාඩ් සෙවීමක් කිරීමට ක්‍රමයක් තිබේද? ගොනු රටාවේ ආරම්භය පමණක් දන්නේද? උදාහරණයක් ලෙස, මා සතුව .gz ගොනු ඇති අතර ඒවා අවසානයේ දිනය / වේලාව මුද්දර ඇත. ABCLog04_18_18_2_21.gz ABC * වලින් ආරම්භ වන ලිපිගොනු නැවත නැවත බැලීමට ක්‍රමයක් තිබේද? මම වෙනුවට උත්සාහ \*.eml.gzසමඟ ඉහත ඔබගේ උදාහරණය තුළ ABCLog*හා ගොනු ආකෘතිය ගැන දෝෂයක් ලබා .:find: paths must precede expression: ABCLog-2018-03-12-10-16-1.log.gz Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
DevelopingDeveloper

71

එකක් පමණක් නොමැති නිසා මෙහි විශාල ව්‍යාකූලත්වයක් ඇත zgrep. මම මගේ පද්ධතිය මත අනුවාද දෙකක් ඇති, zgrepසිට gzipහා zgrepසිට zutils. කලින් සඳහන් කර ඇත්තේ එතෙර ලියවිල්ලකි gzip -cdfq. එය -r, --recursiveස්විචයට සහය නොදක්වයි . 1
මෙම රඹුටන් රටේ c++වැඩසටහන සහ එය සහය වන -r, --recursiveවිකල්පය.
ධාවනය zgrep --version | head -n 1කිරීමෙන් ඒවායින් එකක් (ඇත්නම්) පෙරනිමිය බව අනාවරණය වේ:

zgrep (gzip) 1.6

එතීමේ පිටපත,

zgrep (zutils) 1.3

යනු cppක්රියාත්මක.
ඔබට දෙවැන්න තිබේ නම් ඔබට ධාවනය කළ හැකිය:

zgrep 'pattern' -r --format=gz /path/to/dir

කෙසේ වෙතත්, යෝජනා කර ඇති පරිදි, find+ හි zgrepඅනුවාදය සමඟ සමානව ක්‍රියා කරයි zgrep:

find /path/to/dir -name '*.gz' -exec zgrep -- 'pattern' {} +

නම් zgrepඔබේ පද්ධතිය හා අතුරුදහන් (බෙහෙවින් ම නො) ඔබ සමඟ උත්සාහ කරන්න:

find /path/to/dir -name '*.gz' -exec sh -c 'gzip -cd "$0" | grep -- "pattern"' {} \;

නමුත් විශාල අවාසියක් ඇත: ගැලපෙන රේඛාවලට පෙර ලිපිගොනු නාමයක් නොමැති බැවින් තරඟ කොතැනදැයි ඔබ නොදනී.


1: මන්ද එය ගැටළු සහගත වනු ඇත


1
නම් zgrepzutils සමග ඔබ උබුන්ටු එය ස්ථාපනය කල හැක ලබාගත නොහැක sudo apt-get install zutils.
therealmarv

1
@Therealmarv වෙතින් ඉදිරියට ... පසුව උබුන්ටු විසින් gzip එක වෙනුවට zutres zgrep භාවිතා කරනු ඇත. එවිට -r වැඩ කරයි!
එලියා ලින්

රටාව ගැලපෙන ගොනුවේ රේඛා අංකය මුද්‍රණය කිරීමට ක්‍රමයක් තිබේද?
DogEatDog

@DogEatDog - වගේ grep -n, zgrep -nමාර්ගය අංක මුද්රණය කරනු ඇත එය අත්පොතෙහි ඇත ...
don_crissti

9

agයනු grepහොඳ අමතර විශේෂාංග සහිත ප්‍රභේදයකි .

  • සම්පීඩිත ගොනු සඳහා -z විකල්පය ඇත,
  • බොහෝ අක්කර ලක්ෂණ ඇත.
  • එය වේගවත් ය

ඒ නිසා:

ag -r -z your-pattern-goes-here   folder

ස්ථාපනය කර නොමැති නම්,

apt-get install silversearcher-ag   (debian and friends)
yum install the_silver_searcher     (fedora)
brew install the_silver_searcher    (mac)

1
එහි ප්‍රති .ලයක් ag: truncated file: Successලෙස මට ලැබෙනවා . මම වෙනත් කොඩියක් එක් කළ යුතුද?
යාර්

නියම මෙවලමක් නමුත් තවමත් ගැටළු කිහිපයක් ඇත 1280 1348 . දැන් එයට කොඩි අවශ්‍යයිag --search-binary -z "quick"
hrvoj3e

5

පුනරාවර්තනය පමණක් පහසුය:

   -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

කෙසේ වෙතත්, සම්පීඩිත ගොනු සඳහා ඔබට මෙවැනි දෙයක් අවශ්‍ය වේ:

shopt globstar 
for file in /path/to/directory/**/*gz; do zcat ""$file" | grep pattern; done

path/to/directory සෑම දිනකම උප බහලුම් අඩංගු මව් නාමාවලිය විය යුතුය.


zgrepපැහැදිලි පිළිතුර නමුත් අවාසනාවකට එය -rධජයට සහය නොදක්වයි . සිට man zgrep:

මෙම grep විකල්පයන් zgrep දෝෂ කේතයකින් අවසන් වීමට හේතු වේ: (- [d rR zZ] | --di * | --exc * | --inc * | --rec * | --nu *).


3

ඔබේ පද්ධතියට zgrep තිබේ නම්, ඔබට සරලව කළ හැකිය

zgrep -irs your-pattern-goes-here the-folder-to-search-goes-here/

ඔබේ පද්ධතිය zgrep නොමැති නම්, ඔබට එය භාවිතා කළ හැක සොයා එසේ වගේ එක් එක් ගොනුව එරෙහිව zcat හා අයිතිය සුරකියි ක්රියාත්මක කිරීමට අණ:

find the-folder-to-search-goes-here/ -name '*.gz' \ -exec sh -c 'echo "Searching {}" ; zcat "{}" | grep your-pattern-goes-here ' \;


මේ ගැන මට සමාව දෙන්න ... සෙවිය යුතු ලිපිගොනු ස්ථර කිහිපයක් ගැඹුරු ය. ~ / gmvault-db / db / 2015-02 සංරක්ෂණය කරන ලද සෑම මාසයක් සඳහාම ෆෝල්ඩරයක් අඩංගු වන අතර, ඊට යටින් එම මාසය සඳහා .gz ගොනු ගබඩා කර ඇත. මම මුළු ගස තුළම .mil සොයන්නේ නම්, මා කරන්නේ එයද? find / gmvault-db / db / -name '* .gz' \ -exec sh -c 'echo "සොයමින් {}"; zcat "{}" | grep .mil '\;
කෙන්ඩර්

1
එය හොඳයි - "r" in -irs zgrep නැවත නැවත සෙවීමට හේතු වේ. Find විධානය පෙරනිමියෙන් පුනරාවර්තනය වන බැවින් .gz වලින් අවසන් වන ඕනෑම ගොනුවක් zcatted කර grep වෙත යවනු ලැබේ. (සහ} the සෙවීමට ආසන්න ගොනුවේ සාපේක්ෂ මාර්ගයට පුළුල් වේ). එබැවින් ඔබට පහරක් එල්ල වූ විට, ඊට පෙර Searching ~/gmvault-db/db/2015-02/03/whatever.gz
කලමාසෝ වෙතින්

මෙන්න මම ආපසු ලබා ගන්නා දේ: සොයා ගන්න: "මාර්ග ප්‍රකාශනයට පෙර තිබිය යුතුය: -exec" මෙන්න මම භාවිතා කළ විධානය: find ~ / gmvault-db / db / -name '* .gz' \ -exec sh -c 'echo "සෙවීම { } "; zcat "{}" | grep .mil '\;
කෙන්ඩර්

'* .gz' සහ -exec අතර ඇති බැක්ස්ලෑෂ් එක ඉවත් කරන්න.
කලමසෝ

4
zgrep-rකිසියම් හේතුවක් නිසා ධජය ගන්නේ නැත . එහි සඳහන් වේ man zgrep(මගේ පිළිතුර ද බලන්න).
ටර්ඩන්

0

xzgrep -l "string" ./*/*.eml.gz

xzgrep යනු zgrep උපයෝගිතා වල ව්‍යුත්පන්නයකි (අඩු / බින් / xzgrep)

මෑන් පිටුවෙන්:

xzgrep xz (1), lzma (1), gzip (1), bzip2 (1), හෝ lzop (1) සමඟ සම්පීඩිත හෝ සම්පීඩිත විය හැකි ගොනු මත grep (1) ඉල්ලා සිටී. නිශ්චිතව දක්වා ඇති සියලුම විකල්ප කෙලින්ම grep (1) වෙත යවනු ලැබේ.

-l ගැලපෙන ගොනු නාමය මුද්‍රණය කරන්න

ස්ක්‍රිප්ටයේ විශේෂයෙන් තහනම් කර ඇති පරිදි පුනරාවර්තනය සඳහා ආර් ක්‍රියා නොකරනු ඇත, කෙසේ වෙතත් සරල ෂෙල් ග්ලෝබින් අපව එහි ගෙන යා යුතුය

./*/*.eml.gz

සාපේක්ෂ මාර්ගයකින්.

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.