বিভিন্ন আর্কাইভ ফর্ম্যাটগুলির পুনরাবৃত্তভাবে সমস্ত সংরক্ষণাগার ফাইলগুলি সন্ধান করুন এবং ফাইলের নাম নিদর্শনগুলির জন্য তাদের অনুসন্ধান করুন


11

সর্বোপরি আমি এই মত একটি কল করতে চাই:

$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"

... যাতে এই সরঞ্জাম

  • প্রদত্ত পথটির একটি পুনরাবৃত্ত স্ক্যান করে
  • সমর্থিত সংরক্ষণাগার ফর্ম্যাটগুলির সাথে সমস্ত ফাইল নিয়ে যায় যা কমপক্ষে জিপ, রাআর, 7 জেড, টার.বিজেড, টার.gz এর মতো "সর্বাধিক সাধারণ" হওয়া উচিত ...
  • এবং প্রশ্নের উত্তর প্যাটার্নের জন্য সংরক্ষণাগারটির ফাইল তালিকা স্ক্যান করুন (এখানে *vacation*jpg)

আমি কীভাবে সরঞ্জাম, টার, আনজিপ এবং একসাথে অনুসন্ধান করতে পারি সে সম্পর্কে সচেতন। আমি এগুলি শেল স্ক্রিপ্টের সাথে একত্রিত করতে পারি তবে আমি একটি সহজ সমাধান খুঁজছি যা শেল ওয়ান-লাইনার বা উত্সর্গীকৃত সরঞ্জাম হতে পারে (জিইউআই সরঞ্জামগুলিতে ইঙ্গিতগুলি স্বাগত তবে আমার সমাধানটি অবশ্যই কমান্ড লাইন ভিত্তিক হওয়া উচিত)।

উত্তর:


9

(থেকে অভিযোজিত আমি কিভাবে যাও recursively সংকুচিত আর্কাইভ মাধ্যমে grep করেন? )

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

mountavfs

এর পরে, যদি /path/to/archive.zipকোনও স্বীকৃত সংরক্ষণাগার হয়, তবে ~/.avfs/path/to/archive.zip#এটি এমন একটি ডিরেক্টরি যা আর্কাইভের সামগ্রীগুলি উপস্থিত রয়েছে বলে মনে হয়।

find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
     -exec sh -c '
                  find "$0#" -name "*vacation*.jpg"
                 ' {} 'Test::Version' \;

ব্যাখ্যা:

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

বা zsh ≥4.3 এ:

mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
     reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')

ব্যাখ্যা:

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

9

আপনি যদি এভিএফএস সমাধানের চেয়ে সহজ কিছু চান তবে আমি এটি করার জন্য পাইথন স্ক্রিপ্ট লিখেছিলাম আরকফাইন্ড । আপনি আসলে ঠিক করতে পারেন

$ arkfind /path/to/search/ -g "*vacation*jpg"

এটি পুনরাবৃত্তভাবে এটি করবে, যাতে আপনি সংরক্ষণাগারগুলির অভ্যন্তরে সংরক্ষণাগারগুলিকে স্বেচ্ছাসেবী গভীরতার দিকে দেখতে পারেন।


ধন্যবাদ, চমৎকার অবদান! বিশেষত যদি এভিএফএসের কোনও বিকল্প না থাকে।
mdo

এটি জার ফাইলগুলি সমর্থন করে তবে দুর্দান্ত হবে।
চেমিক

@ চেমিক - উল্লেখ করেছেন ! আমি এই সপ্তাহান্তে এটিতে আরও কিছু কাজ করব :) জার খুব বেশি শক্ত হওয়া উচিত নয়, আমি বিশ্বাস করি এটি সত্যিই বাইরের বিশ্বের কেবল একটি জিপ ফাইল।
স্পষ্টভাবে

@ চেমিক - আমি কেবল এটি চেষ্টা করেছি এবং এটি যাইহোক ফাইলগুলিকে তার বর্তমান ফর্মটিতে সমর্থন করা উচিত। আপনি কি এটি পরীক্ষা করে দেখতে পারেন, এবং এটি যদি আপনি প্রত্যাশা মতো কাজ না করেন, গিথুব পৃষ্ঠায় একটি বাগ ফাইল করুন? (আমি কেবল একটি বাগ ঠিক করেছি, সুতরাং আপনার অনুলিপিটি আপডেট করার বিষয়ে নিশ্চিত হন))
অবধি

1
হ্যাঁ আমি এখন দেখছি, এটি কাজ করে। আপনি "জেআর ফাইলগুলি" পুনরায়
চেমিক

2

আমার স্বাভাবিক সমাধান:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'

উদাহরণ:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'

ফলাফলগুলি হ'ল:

foozip1.zip:
foozip2.zip:
foozip3.zip:
    DESIRED_FILE_TO_SEARCH
foozip4.zip:
...

আপনি যদি হিট সহ কেবল জিপ ফাইলটি চান :

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'

FILENAME এখানে দু'বার ব্যবহার করা হয়েছে, সুতরাং আপনি একটি পরিবর্তনশীল ব্যবহার করতে পারেন।

সন্ধানের সাথে আপনি প্যাথ / টু / অনুসন্ধান ব্যবহার করতে পারেন


2

আরেকটি সমাধান যা কাজ করে zgrep

zgrep -r filename *.zip

1
এর বাস্তবায়ন কী zgrep? এটি জিএনইউ gzip( /bin/zgrep: -r: option not supported, zgrep (gzip) 1.6) এর সাথে যে পাঠানো হয়েছে তার সাথে কাজ করে না
স্টাফেন চেজেলাস

2

আইএমএইচও ব্যবহারকারী-বন্ধুত্বের বিষয়টিও ব্যাশের ক্ষেত্রে হওয়া উচিত:

 while read -r zip_file ; do echo "$zip_file" ; unzip -l "$zip_file" | \
 grep -i --color=always -R "$to_srch"; \
 done < <(find . \( -name '*.7z' -o -name '*.zip' \)) | \
 less -R

এবং টারের জন্য (এইটি নিরীক্ষিত ...)

 while read -r tar_file ; do echo "$tar_file" ; tar -tf  "$tar_file" | \
 grep -i --color=always -R "$to_srch"; \
 done < <(find . \( -name '*.tar.gz' -o -name '*.tar' \)) | \
 less -R

unzip7z বা tar.gz ফাইলগুলির সাথে কী প্রয়োগ বাস্তবায়ন করতে পারে?
স্টাফেন চেজেলাস

হ্যাঁ এটি একটি বাগ ... সংশোধন করা হয়েছে ... সঠিকভাবে সঠিক ফাইলের জন্য সঠিক বাইনারিগুলি ব্যবহার করা উচিত ... আমি কেবল ওয়ান-লাইনারটি দেখানোর লক্ষ্য রেখেছি ... জিৎ এটি প্রায় প্রস্তুত অবস্থায় থাকবে will কীভাবে প্রাপ্তি হিসাবে ...
ইওর্ডান জর্জিভ

0

libarchiveএর bsdtarফাইল ফর্ম্যাটগুলির বেশিরভাগ পরিচালনা করতে পারে, তাই আপনি এটি করতে পারেন:

find . \( -name '*.zip' -o     \
          -name '*.tar' -o     \
          -name '*.tar.gz' -o  \
          -name '*.tar.bz2' -o \
          -name '*.tar.xz' -o  \
          -name '*.tgz' -o     \
          -name '*.tbz2' -o    \
          -name '*.7z' -o      \
          -name '*.iso' -o     \
          -name '*.cpio' -o    \
          -name '*.a' -o       \
          -name '*.ar' \)      \
       -type f                 \
       -exec bsdtar tf {} '*vacation*jpg' \; 2> /dev/null

যা আপনি জিএনইউ findদিয়ে এর সাথে সরল (এবং কেস-সংবেদনশীলতার সাথে মিলতে উন্নত করতে পারেন) :

find . -regextype egrep \
       -iregex '.*\.(zip|7z|iso|cpio|ar?|tar(|\.[gx]z|\.bz2)|tgz|tbz2)' \
       -type f \
       -exec bsdtar tf {} '*vacation*jpg' \; 2> /dev/null

এটি সংরক্ষণাগারের পথটি মুদ্রণ করে না যেখানে এই *vacation*jpgফাইলগুলি পাওয়া যায়। এই নামটি মুদ্রণের জন্য আপনি শেষ লাইনটি প্রতিস্থাপন করতে পারেন:

-exec sh -ac '
   for ARCHIVE do
     bsdtar tf "$ARCHIVE" "*vacation*jpg" |
       awk '\''{print ENVIRON["ARCHIVE"] ": " $0}'\''
   done' sh {} + 2> /dev/null

যা একটি আউটপুট দেয়:

./a.zip: foo/blah_vacation.jpg
./a.zip: bar/blih_vacation.jpg
./a.tar.gz: foo/blah_vacation.jpg
./a.tar.gz: bar/blih_vacation.jpg

বা সাথে zsh:

setopt extendedglob # best in ~/.zshrc
for archive (**/*.(#i)(zip|7z|iso|cpio|a|ar|tar(|.gz|.xz|.bz2)|tgz|tbz2)(.ND)) {
  matches=("${(f@)$(bsdtar tf $archive '*vacation*jpg' 2> /dev/null)"})
  (($#matches)) && printf '%s\n' "$archive: "$^matches
}

মনে রাখবেন যে আরও অনেকগুলি ফাইল ফর্ম্যাট রয়েছে যা কেবল zipবা tgzফাইলগুলি ছদ্মবেশে .jarবা .docxফাইলগুলিতে রয়েছে। আপনি এগুলিকে আপনার find/ zshঅনুসন্ধানের প্যাটার্নে যুক্ত করতে পারেন , bsdtarএক্সটেনশনের কোনও যত্ন নেই (যেমন এটি ফাইলের ধরণ নির্ধারণের জন্য এক্সটেনশনের উপর নির্ভর করে না)।

নোট করুন যে *vacation*.jpgউপরেরটি পুরো ফাইল সংরক্ষণাগার সদস্যের পাথের সাথে মিলছে, কেবল ফাইলের নাম নয়, তাই এটি মিলবে vacation.jpgতবে এটিও চালিয়ে যাবে vacation/2014/file.jpg

কেবল ফাইলের সাথে মিল রাখতে, একটি কৌশলটি হ'ল এক্সট্রাক্ট মোডটি ব্যবহার করতে হবে , -s(বিকল্প) ব্যবহার করবে যা ম্যাচের pফাইলগুলির নাম মুদ্রণের জন্য একটি পতাকা সহ রেজিেক্সপ ব্যবহার করে এবং তারপরে কোনও ফাইল বের করা হয়নি তা নিশ্চিত করুন:

bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"

নোট করুন যে এটি স্ট্ডারগুলিতে তালিকা আউটপুট করবে এবং >>প্রতিটি লাইনে সংযোজন করবে। যাই হোক, bsdtarসবচেয়ে মত tarবাস্তবায়নের প্রদর্শনের ফাইলের নাম কাপড় ইস্ত্রী করা থাকে যদি তারা সম্পর্কে newline বা ব্যাকস্ল্যাশ (যেমন অনুষ্ঠিত মত কিছু অক্ষর \nবা \\)।

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