.Gz ফাইলগুলির মাধ্যমে আমি কীভাবে পুনরাবৃত্তি করতে পারি?


135

আমি আমার জিমেইল বার্তাগুলি নিয়মিত ডাউনলোড করার জন্য একটি স্ক্রিপ্ট ব্যবহার করছি যা .gz ফাইলগুলিতে কাঁচা। ইমেলকে সংকুচিত করে। স্ক্রিপ্ট প্রতিটি দিনের জন্য একটি ফোল্ডার তৈরি করে এবং তারপরে প্রতিটি বার্তাকে তার নিজের ফাইলে সংকোচিত করে।

আমি একটি "স্ট্রিং" এর জন্য এই সংরক্ষণাগারটির মাধ্যমে অনুসন্ধানের একটি উপায় চাই।

গ্রেপ একা এটি করতে উপস্থিত হয় না। আমি সার্চমনকিও চেষ্টা করেছিলাম।


16
ব্যবহার zgrep:zgrep - search possibly compressed files for a regular expression
আরকাদিউস দ্রাব্যাসিক

উত্তর:


141

আপনি যদি বর্তমান ডিরেক্টরিতে সমস্ত .eml.gz ফাইলগুলিতে পুনরাবৃত্তভাবে গ্রেপ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

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

আপনাকে প্রথমে পালাতে হবে *যাতে শেলটি এর ব্যাখ্যা না করে। -print0প্রতিটি ফাইল এটি খুঁজে পাওয়ার পরে নাল অক্ষর মুদ্রণ করতে বলে; xargs -0স্ট্যান্ডার্ড ইনপুট থেকে পড়া এবং প্রতিটি ফাইলের জন্য কমান্ড চালায়; zgrepএর মতো কাজ করে grepতবে প্রথমে ফাইলটি সঙ্কোচিত করে।


2
'-প্রিন্ট 0' এবং '-0' বাধ্যতামূলক নয়। xargs ডিফল্টরূপে '\ n' ব্যবহার করে।
জাইম এম

1
এগুলিতে প্রয়োজনীয় যদি পথগুলিতে স্থানের অক্ষর থাকতে পারে; এগুলি ব্যবহার না করার জন্য জটিলতা ছাড়া অন্য কোনও কারণ নেই।
ড্যানিয়েল গ্রিসকম

2
zgrepপ্রকৃতপক্ষে grepসঙ্কুচিত ফাইলগুলিতে রান করার চেয়ে দ্রুত বলে মনে হয় । এটি হ'ল কারণ সংকুচিত ফাইলগুলি এইচডি থেকে পড়তে পারে এবং এইচডি থেকে একটি সঙ্কুচিত ফাইলটি পড়ার চেয়ে দ্রুত সংক্ষেপিত হয়।
জেরেমিয়া

@JaimeM। ডিফল্টরূপে ফাঁকা (সাদা স্থান) xargsব্যবহার করে। অবশ্যই, ফাইলগুলির মধ্যে প্রায়শই নতুন লাইন থাকে না, তবে স্পেসগুলি শোনা যায় না (এমনকি বেশিরভাগ UNIXy প্রকারে সেগুলি ভ্রূণু থাকে)। এটি বলেছে যে, আরও সহজেই হোয়াইটস্পেসের বিষয়ে চিন্তা না করে আপনি সরল করতে পারেন: এটি অতিরিক্ত প্রক্রিয়াকরণের প্রবর্তন এবং পাইপিংয়ের ওভারহেড ছাড়াই এবং মোটামুটি সংক্ষিপ্তভাবে ছাড়াই, প্রতি-লঞ্চের একই সুরক্ষার জন্য / এবং সমস্ত কিছু পেতে পারে। এর সাথে পসিক্স নির্দিষ্ট করা আছে, সুতরাং এটি আমার জ্ঞানের সাথে প্রায় অর্ধ-সাম্প্রতিক ইউনিক্স-এর মতো সিস্টেমে হওয়া উচিত। find . -name '*.eml.gz' -exec zgrep "STRING" {} +xargs-print0-0-exec+
শ্যাডোর্যাঞ্জার

@ জ্যারেড কি কেবল ফাইলের ধরণটির সূচনা জেনে কোনও ওয়াইল্ডকার্ড অনুসন্ধান করার কোনও উপায় আছে? উদাহরণস্বরূপ, আমার কাছে .gz ফাইল রয়েছে যার শেষের দিকে তারিখ / সময় স্ট্যাম্প রয়েছে। ABCLog04_18_18_2_21.gz এবিসি * দিয়ে শুরু হওয়া ফাইলগুলির জন্য পুনরাবৃত্তভাবে দেখার উপায় আছে কি? আমি \*.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]
ডেভেলপিং

68

এখানে একটি বিভ্রান্তি রয়েছে কারণ এখানে কেবল একটি নেই 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
যদি zgrepজুটিলগুলি থেকে পাওয়া না যায় তবে আপনি এটি উবুন্টুতে ইনস্টল করতে পারেন sudo apt-get install zutils
therealmarv

1
@ থেরিয়ালমার্ভ থেকে অব্যাহত রয়েছে ... এবং তারপরে উবুন্টু জিজিপের পরিবর্তে জুটেলস জিগ্রেপ ব্যবহার করবে। তাহলে -আর কাজ করে!
এলিজা লিন

প্যাটার্নটি মেলে এমন ফাইলটির লাইন নম্বর প্রিন্ট করার কোনও উপায় আছে কি?
ডগএটডগ

@DogEatDog - ঠিক যেন grep -n, zgrep -nলাইন no.s. প্রিন্ট হবে এটি ম্যানুয়ালটিতে ...
don_crissti

7

aggrepকিছু চমত্কার অতিরিক্ত বৈশিষ্ট্য সহ এর একটি বৈকল্পিক ।

  • সংক্ষিপ্ত ফাইলগুলির জন্য -z বিকল্প রয়েছে,
  • AC এর অনেকগুলি বৈশিষ্ট্য রয়েছে।
  • এটি দ্রুত

তাই:

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ফলাফল হিসাবে পেতে । অন্য কোন পতাকা যুক্ত করা উচিত?
ইয়ার

4

একা পুনরাবৃত্তি সহজ:

   -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:

এই গ্রেপ বিকল্পগুলির ফলে zgrep ত্রুটি কোডের সাথে শেষ হতে পারে: (- [[ডি আরআর জেডজেড] | --di * | --exc * | --inc * | --rec * | --nu *))।


3

যদি আপনার সিস্টেমে zgrep থাকে তবে আপনি সহজেই পারেন

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

আপনার সিস্টেমে zgrep আছে না হয়, তাহলে আপনি ব্যবহার করতে পারেন খোঁজ তাই মত প্রতিটি ফাইল বিরুদ্ধে zcat এবং grep চালানোর জন্য কমান্ড প্রয়োগ করুন:

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


এতে আমাকে সবুজতা ক্ষমা করুন ... অনুসন্ধান করা ফাইলগুলি কয়েকটি স্তর গভীর are g / gmvault-db / db / 2015-02 এ প্রতি মাসে সংরক্ষণাগারভুক্ত ফোল্ডার থাকে এবং তারপরে সেই মাসের জন্য .gz ফাইলগুলি সংরক্ষণ করা হয়। আমি যদি পুরো গাছের মধ্যেই .mil অনুসন্ধান করি তবে আমি কি করব? ~ / gmvault-db / db / -name '* .gz' \ -exec sh -c 'প্রতিধ্বনি "অনুসন্ধান {}"; zcat "{}" | | গ্রেপ .মিল '\;
কেন্দর

1
এটি দুর্দান্ত - "r" ইন-এর ফলে zgrep পুনরাবৃত্তভাবে অনুসন্ধান করতে পারে। ফাইন্ড কমান্ডটি ডিফল্টরূপে পুনরাবৃত্তভাবে পরিচালিত হয়, সুতরাং .gz এ শেষ হওয়া কোনও ফাইল zcatted হবে এবং গ্রেপ-এ যাবে। (এবং অনুসন্ধান ফাইলটি। ফাইলের আপেক্ষিক পথে প্রসারিত হবে)। সুতরাং আপনি যখন হিট পাবেন, তার আগে হবে Searching ~/gmvault-db/db/2015-02/03/whatever.gz
কালামাজু

আমি যা ফিরে আসছি তা এখানে: সন্ধান করুন: "পাথগুলি অবশ্যই প্রকাশের আগে চলেছে: -exec" আমি যে আদেশটি ব্যবহার করেছি তা এখানে: ~ / gmvault-db / db / -name '* .gz' ex -exec sh -c 'প্রতিধ্বনি "অনুসন্ধান { } "; zcat "{}" | | গ্রেপ .মিল '\;
কেন্দর

'* .gz' এবং -exec এর মধ্যে ব্যাকস্ল্যাশ বের করুন।
কালামাজু

4
zgrep-rকোনও কারণে পতাকাটি নেবে না । এটি উল্লেখ করা হয়েছে man zgrep(এছাড়াও আমার উত্তর দেখুন)।
টেরডন

0

xzgrep -l "স্ট্রিং" ./*/*.eml.gz

xzgrep zgrep ইউজগুলির (একটির / বিন / xzgrep কম) একটি উপকরণ

ম্যান পৃষ্ঠা থেকে:

xzgrep xp (1), lzma (1), gzip (1), bzip2 (1), বা lzop (1) দিয়ে সংকুচিত বা সংকুচিত হতে পারে এমন ফাইলগুলিতে গ্রেপ (1) কে আহ্বান জানায়। নির্দিষ্ট করা সমস্ত বিকল্প সরাসরি গ্রেপ (1) এ প্রেরণ করা হবে।

-l মিলে যাওয়া ফাইলটির নাম মুদ্রণ করুন

পুনরাবৃত্তির জন্য আরআর কাজ করবে না কারণ এটি স্ক্রিপ্টে বিশেষভাবে নিষিদ্ধ করা হয়েছে, তবে সাধারণ শেল গ্লোব্বিং আমাদের সেখানে পাওয়া উচিত

./*/*.eml.gz

আপেক্ষিক পথ থেকে যেখানে ./today/sample.eml.gz, শেলের মধ্যে আমাদের তুলনামূলক অবস্থানের এক স্তরের নীচে রয়েছে তার সমস্ত উদাহরণের সাথে মিলবে, এটি ".eml.gz" দিয়ে শেষ হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.