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