আমি সংকুচিত আর্কাইভগুলির মাধ্যমে কীভাবে পুনরাবৃত্তভাবে গ্রেপ করব?


16

আমি use Test::Versionসিপিএন-এ কী মডিউলগুলি জানার চেষ্টা করছি । তাই আমি minicpanএটি আয়না ব্যবহার করেছি । আমার সমস্যাটি হ'ল আমাকে ডাউনলোড করা সংরক্ষণাগারগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে এবং সংরক্ষণাগারগুলিতে থাকা ফাইলগুলি গ্রেপ করতে হবে। কেউ আমাকে বলতে পারে আমি কীভাবে এটি করতে পারি? অগ্রাধিকারযোগ্যভাবে এমনভাবে যা আমাকে জানায় যে সংরক্ষণাগারে কোন ফাইল এবং এটি কোন লাইনে রয়েছে।

(দ্রষ্টব্য: এগুলি সমস্ত টারবল নয় কিছু কিছু জিপ ফাইল)

উত্তর:


18

ঠিক আছে, আসুন ইউনিক্স দর্শনটি প্রয়োগ করি। এই কাজের উপাদানগুলি কী কী?

  • পাঠ্য অনুসন্ধান: আপনার কোনও ফাইলের পাঠ্য অনুসন্ধান করার জন্য একটি সরঞ্জাম প্রয়োজন grep
  • রিকার্সিভ: ডিরেক্টরি ট্রিতে ফাইল সন্ধান করার জন্য আপনার একটি সরঞ্জাম প্রয়োজন find
  • সংরক্ষণাগারগুলি: সেগুলি পড়ার জন্য আপনার একটি সরঞ্জাম প্রয়োজন।

বেশিরভাগ ইউনিক্স প্রোগ্রাম ফাইলগুলিতে কাজ করে। সুতরাং সংরক্ষণাগার উপাদানগুলিতে সহজেই পরিচালনা করতে আপনাকে ফাইল হিসাবে তাদের অ্যাক্সেস করতে হবে, অন্য কথায় আপনাকে ডিরেক্টরি হিসাবে তাদের অ্যাক্সেস করতে হবে।

AVFS ফাইলসিস্টেম উপহার ফাইলসিস্টেম যেখানে প্রত্যেক আর্কাইভ ফাইল একটি দৃশ্য /path/to/foo.zipডাইরেক্টরি হিসাবে প্রবেশযোগ্য ~/.avfs/path/to/foo/zip#। এভিএফএস বেশিরভাগ সাধারণ সংরক্ষণাগার ফাইল ফর্ম্যাটগুলিতে পঠনযোগ্য অ্যাক্সেস সরবরাহ করে।

mountavfs
find ~/.avfs"$PWD" \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
     -exec sh -c '
                  find "$0#" -name "*.pm" -exec grep "$1" {\} +
                 ' {} 'Test::Version' \;
fusermount -u ~/.avfs   # optional

ব্যাখ্যা:

  • এভিএফএস ফাইল সিস্টেমটি মাউন্ট করুন।
  • সংরক্ষণাগার ফাইলগুলির জন্য অনুসন্ধান করুন ~/.avfs$PWDযা বর্তমান ডিরেক্টরিটির অ্যাভিএফএস ভিউ।
  • প্রতিটি সংরক্ষণাগারের জন্য, নির্দিষ্ট শেল স্নিপেট ( $0= সংরক্ষণাগার নাম এবং $1= অনুসন্ধানের প্যাটার্ন সহ) চালিত করুন।
  • $0#সংরক্ষণাগারটির ডিরেক্টরি ভিউ $0
  • {\}পরিবর্তে আর্গুমেন্টের অভ্যন্তরে {}বাইরের findবিকল্পগুলি প্রয়োজন (কিছু এটি করে, কিছু না করে) এর জন্য প্রয়োজন।{}-exec ;
  • .চ্ছিক: অবশেষে এভিএফএস ফাইল সিস্টেমটি আনমাউন্ট করুন।

বা zsh ≥4.3 এ:

mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
     reply=($REPLY\#/**/*.pm(.N))
'\')

ব্যাখ্যা:

  • ~/.avfs$PWD/**/*.(tgz|tar.gz|zip) বর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলির এভিএফএস ভিউতে সংরক্ষণাগারগুলি মেলে।
  • PATTERN(e\''CODE'\')PATTERN এর প্রতিটি ম্যাচে CODE প্রয়োগ করে। ম্যাচ করা ফাইলটির নাম রয়েছে $REPLYreplyঅ্যারে সেট করা ম্যাচটিকে নামের তালিকায় পরিণত করে।
  • $REPLY\# সংরক্ষণাগারটির ডিরেক্টরি ভিউ।
  • $REPLY\#/**/*.pm.pmসংরক্ষণাগারটিতে ফাইলগুলির সাথে মেলে ।
  • Nউল্লিখিত glob কোয়ালিফায়ার প্যাটার্ন তোলে একটি খালি তালিকা প্রসারিত যদি কোনো মিল নেই।

এটি অন্যান্য আর্কাইভগুলি মাউন্ট করার এবং তারপরে সমস্ত আর্কাইভ আনমাউন্ট করার অন্যান্য অন্ত্রের সমস্যা তৈরি করে কারণ সমস্যার অংশটি হ'ল 22k সংরক্ষণাগার রয়েছে যার মাধ্যমে অনুসন্ধান করা দরকার
xenoterracide

@ এক্সেনোটেরাকাইড: এটি কীভাবে সমস্যা? এভিএফএসের সাহায্যে আপনার একক মাউন্ট পয়েন্ট ( ~/.avfs) রয়েছে এবং প্রতিটি সংরক্ষণাগার অ্যাক্সেস স্বয়ংক্রিয় হয় ( ~/.avfs/path/to/archive.zip\#এভিএফএস ফাইল সিস্টেমের একটি সাধারণ ডিরেক্টরি, কোনও মাউন্ট পয়েন্ট নয়)। অবশ্যই, আপনি যে প্রতিটি সংরক্ষণাগার অ্যাক্সেস করছেন তার অর্থ সামান্য পারফরম্যান্স হিট, তবে এটি সমস্যার অভ্যন্তরীণ।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ গিলস কেবল এই সত্যটি যে এখন আমাকে এগুলি দেখতে হবে এবং প্রথমে সেগুলি কীভাবে মাউন্ট করতে হবে তা নির্ধারণ করতে হবে, যা কিছুটা খারাপ ধারণা বলে মনে হয়, যাবার সময় এগুলি মাউন্ট করা ভাল এবং অনুসন্ধানের পরে আনমাউন্ট করা ভাল।
xenoterracide

@ এক্সেনোটেরাকাসাইড: আবার: না, আপনাকে পৃথকভাবে এগুলি মাউন্ট করার দরকার নেই। আমার ওয়ার্কফ্লোটি (প্রয়োজনে এভিএফএস ইনস্টল করা বাদে) আমার কোড স্নিপেটে রয়েছে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ গিলিস ভাল আছে আমাকে এটিকে কিছুটা খনন করতে হবে ... কারণ আমি- find: missing argument to এক্সেক'` পেয়েছি এবং অনেকগুলি zsh থেকে zsh: Input/output error: Data-Maker-0.27
পেয়েছি

0

দেখা যাচ্ছে যে আমি এইভাবে এটি করতে পারি

find authors/ -type f -exec zgrep "Test::Version" '{}' +  

তবে এটি এর ফলাফল দেয়:

authors/id/J/JO/JONASBN/Module-Info-File-0.11.tar.gz:Binary file (standard input) matches

যা তারবাল কোথায় আছে তা খুব নির্দিষ্ট নয়। আশা করি কেউ আরও ভাল উত্তর নিয়ে আসতে পারেন।


0

চ্যালেঞ্জের জন্য ধন্যবাদ, আমি এনেছি:

#!/bin/bash
#

# tarballs to check in
find authors/ -type f | while read tarball; do

    # get list of files in tarball (not dirs ending in /):
    tar tzf $tarball | grep -v '/$' | while read file; do       

        # get contents of file and look for string
        tar -Ozxf conform.tar.gz $file | grep -q 'Text::Version' && echo "Tar ($tarball) has matching File ($file)"

    done

done

সবেমাত্র আপনার লাইনের নম্বর প্রয়োজন দেখেছি। লাইন নম্বরটি ক্যাপচার করতে সম্ভবত এটি গ্রেপ-এন এবং অ্যাডকের কিছু সংমিশ্রণের সাথে কাজ করতে পারে। ফাইলের নাম তালিকাভুক্ত করতে গ্রেপ-এইচ এর মতো সহজ হতে পারে না কারণ এটি সর্বদা স্টিডিন, সুতরাং আরও লাইন লাগতে পারে।
কাইল স্মিথ

আমার সিস্টেমে চালিত হওয়ার সময় ত্রুটিগুলি আউট হয়েছে, অসীম পুনরাবৃত্তি হয়েছে:tar (child): conform.tar.gz: Cannot open: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now
xenoterracide

এছাড়াও আমি বুঝতে পারিনি যে আমি যখন এই প্রথম পোস্ট করেছি সিপিএন-র কিছু সংরক্ষণাগারগুলি জিপ ফাইল।
xenoterracide

এইচএম, আমি কেবল .tar.gz ফাইলগুলির কাঠামো দিয়ে পরীক্ষা করেছি - এটি ফাইলের ধরণের ভিত্তিতে যথাযথ পদক্ষেপ গ্রহণ করা আরও শক্তিশালী করা যেতে পারে তবে এটি একটি শালীন সূচনা পয়েন্ট দেয়।
কাইল স্মিথ

0

হয়তো আমার উত্তর কারও পক্ষে সহায়ক হবে:

#!/bin/bash

findpath=$(echo $1 | sed -r 's|(.*[^/]$)|\1/|')

# tarballs to check in
find $findpath -type f | while read tarball; do

    # get list of files in tarball (not dirs ending in /):
    if [ -n "$(file --mime-type $tarball | grep -e "application/jar")" ]; then

        jar tf $tarball | grep -v '/$' | while read file; do
            # get contents of file and look for string
            grepout=$(unzip -q -c $tarball $file | grep $3 -e "$2")

            if [ -n "$grepout" ]; then
                echo "*** $tarball has matching file ($file):"
                echo $grepout
            fi

        done

    elif tar -tf $tarball 2>/dev/null; then

        tar -tf $tarball | grep -v '/$' | while read file; do
            # get contents of file and look for string
            grepout=$(unzip -q -c $tarball $file | grep $3 -e "$2")

            if [ -n "$grepout" ]; then
                echo "*** $tarball has matching file ($file):"
                echo $grepout
            fi

        done

    else
        file=""
        grepout=$(grep $3 -e "$2" $tarball)

        if [ -n "$grepout" ]; then
            echo "*** $tarball has matching:"
            echo $grepout
        fi

    fi

done

0

ইনস্টল করার পরে p7zip-*আপনি এটি করতে সক্ষম হবেন:

ls | xargs -I {} 7z l {} | grep whatever | less

lsপ্রথম পাইপ ব্যবহারের আগে আপনাকে ব্যবহার করতে হবে না , সংক্ষেপিত ফাইলগুলির যে তালিকা কাজ করবে। চূড়ান্ত lessকেবল সংক্ষিপ্ত আর্কাইভের ভিতরে থাকা লাইস্টেট জীবনের PATH দেখাবে, তবে এর নাম নয়।


0

সমস্ত প্রয়োজনীয় ফাইলগুলি সনাক্ত করতে সন্ধান করুন এবং সংকুচিত ফাইলগুলিতে সন্ধান করতে zgrep ব্যবহার করুন:

find <folder> -type f -name "<search criteria[*gz,*bz...]>" -execdir zgrep -in "<grep expression>" '{}' ';'

যদিও এটি টার্বলগুলিতে পরীক্ষা করা হয়নি

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