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
जिसे आप सरल कर सकते हैं (और केस-असंवेदनशील रूप से मिलान करने के लिए सुधार कर सकते हैं) GNU के 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
मिलान फ़ाइलों के नाम प्रिंट करने के लिए एक ध्वज के साथ regexps का उपयोग करता है और फिर सुनिश्चित करें कि कोई फ़ाइल नहीं निकाली गई है, जैसे:
bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"
ध्यान दें कि यह stderr पर सूची को आउटपुट करेगा और >>
हर पंक्ति में संलग्न करेगा। किसी भी मामले में bsdtar
, जैसे अधिकांश tar
कार्यान्वयन प्रदर्शन पर फ़ाइल नामों को जोड़ सकते हैं, यदि उनके पास कुछ वर्ण होते हैं जैसे कि newline या backslash (के रूप में प्रदान किया गया ) \n
या \\
।