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বা \\)।