সমস্ত উপ-ডিরেক্টরিতে সমস্ত gzip ফাইলের মধ্যে স্ট্রিংয়ের জন্য ইউনিক্স 'গ্রেপ'


8

.gzসমস্ত ডিরেক্টরি এবং উপ ডিরেক্টরিতে সমস্ত ফাইলের মাধ্যমে আমি কীভাবে পুনরায় পুনরায় স্ট্রিংয়ের জন্য গ্রেপ করব?

উত্তর:


13

@ স্টিভ ওয়েট প্রায় আছে। অতিরিক্ত যুক্তি হিসাবে / ডিভ / নাল ব্যবহার করা ফাইল নামটি দেখানোর জন্য বাধ্য করার এক দুর্দান্ত উপায় (আমি মনে করব, স্টিভকে ধন্যবাদ জানাব) তবে এটি এখনও পাওয়া প্রতিটি ফাইলের জন্য এক্সকে চালায় - একটি বিশাল ওভারহেড।

আপনি প্রতিটি নির্বাহের মধ্যে সর্বাধিক সার্থক হয়ে আপনি যতবার পারেন zgrep চালাতে চান:

find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN

xargszgrep হিসাবে যতগুলি সম্ভব আর্গ (ফাইলের নাম) সরবরাহ করবে এবং findকমান্ড দ্বারা সরবরাহিত সমস্ত ফাইল ব্যবহার না করা অবধি এটি বারবার সম্পাদন করবে । ব্যবহার -print0এবং -0অপশন এটা কাজ করার অনুমতি দেয় যদি সেখানে ফাইল অথবা ডাইরেক্টরি নামের কোনো শূণ্যস্থান আছে।

ম্যাক ওএস এক্সে, আপনি xargs ছাড়াই একই প্রভাব অর্জন করতে পারেন:

find . -iname '*.gz' -exec zgrep PATTERN {} +

+1 এটি দুর্দান্ত। আমি বুঝতে পারি নি যে xargs একাধিক যুক্তি পাস করেছে। আমার * নিক্স কমান্ড লাইন-ফু এর বেশিরভাগই 20 বছর বয়সী এবং আমি মনে করি না 20 বছর আগে xargs এটি করেছিল।
স্টিভ ওয়েট

দেখা গেছে যে ওএস / এক্স-এ সন্ধান xargs এর মতোই আচরণ করে
স্টিভ ওয়েট

1
'+' -তে-শেষ হওয়া সম্পর্কে স্টিভ ওয়েটের জবাব সম্পর্কে আমার মন্তব্য দেখুন।
ড্যানিয়েল অ্যান্ডারসন

-Hকমপক্ষে GNU গ্রেপ-এ, সর্বদা ম্যাচের লাইনের সাথে ফাইলের নামটি দেখানোর জন্য ব্যবহার করুন ।
ড্যানিয়েল অ্যান্ডারসন

1
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

তাই কিছু

find . -iname "*.gz" -exec zgrep PATTERN {} \

-Exec ফাইলটির নাম দেখতে আপনাকে বাধা দেওয়ার জন্য পুনরুক্ত হওয়া প্রতিটি ফাইলের জন্য zgrep এর একটি নতুন উদাহরণ তৈরি করবে। zgrep -rগাছের মধ্য দিয়ে যাওয়ার জন্য ব্যবহার করা ভাল বা যদি -r কাজ না করে তবে অনুসন্ধানের ফলাফলটি পাইপ করুনxargs zgrep
নওফাল ইব্রাহিম

আমি /bin/zgrep: -r: option not supportedআমার নতুন ইনস্টল করা উবুন্টু সিস্টেমটি পেয়ে যাচ্ছি।
আইয়ুব

আপনি তার xargsপরিবর্তে ব্যবহার করতে পারেন ।
নওফাল ইব্রাহিম

'+' -তে-শেষ হওয়া সম্পর্কে স্টিভ ওয়েটের জবাব সম্পর্কে আমার মন্তব্য দেখুন।
ড্যানিয়েল অ্যান্ডারসন

1

@ আইবুবে প্রায় আছে। কমান্ডটি কাজটি করবে তবে আপনাকে ফাইলের নাম বলবে না

নিম্নলিখিত ফাইলগুলির পাশাপাশি আপনার নামও বলা উচিত:

find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;

যোগে /dev/nullযে zgrep নিশ্চিত করবে দুই ফাইলের নামের দেখেন তাই এটি যদি এটি স্ট্রিং খুঁজে বের করে আপনি ফাইলের নাম দেখাবে

সম্পাদনা

আরও গবেষণায় প্রকাশিত হয়েছে যে আমার মেশিনের জন্য (ওএস / এক্স) -execযুক্তি সন্ধানের জন্য যথাসম্ভব ফাইলের নাম যুক্ত করবে ( xargsআচরণের মতো)।


এটি বেশ দুর্দান্ত, আমি ওএসএক্স সম্পর্কে জানতাম না -exec- আমি বহনযোগ্যতা সম্পর্কে তাই আমি এটি কোনও স্ক্রিপ্টে না ব্যবহার করি, তবে কমান্ড প্রম্পটের জন্য দুর্দান্ত।

অন্যান্য সংস্করণের সন্ধানের জন্য, '' 'এর পরিবর্তে' + 'ব্যবহার করুন; এক্সিকিউট স্টেটমেন্টটি শেষ করতে ওএসএক্সের মতো একই কাজ করবে, এই থ্রেডের গল্পগুলি, ডিফল্টরূপে করে। '-Exec কমান্ড {} +' এর জন্য ম্যানুয়াল এন্ট্রি দেখুন। এটি সমস্ত সংস্করণের ক্ষেত্রে সত্য নয় find, তবে বেশিরভাগ আধুনিক সংস্করণগুলির (উদাহরণস্বরূপ দেবিয়ান ভিত্তিক ডিস্ট্রোজে)।
ড্যানিয়েল অ্যান্ডারসন

হ্যাকের -Hপরিবর্তে কমপক্ষে জিএনইউ গ্রেপ-এ, সর্বদা ম্যাচের লাইনের সাথে ফাইলের নামটি দেখানোর জন্য ব্যবহার করুন /dev/null
ড্যানিয়েল অ্যান্ডারসন

0

নিম্নলিখিত একটি ট্রিট কাজ করে zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

এছাড়া কাজ করতে পারে bash, ksh, ইত্যাদি ...

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