libarchive
's bsdtar
bu dosya biçimlerinin çoğunu işleyebilir, böylece şunları yapabilirsiniz:
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
ile basitleştirebileceğiniz (ve büyük / küçük harfe duyarlı olmayan şekilde eşleştirebileceğiniz) :
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
Bu, bu *vacation*jpg
dosyaların bulunduğu arşiv yolunu yazdırmaz . Bu adı yazdırmak için son satırı aşağıdakilerle değiştirebilirsiniz:
-exec sh -ac '
for ARCHIVE do
bsdtar tf "$ARCHIVE" "*vacation*jpg" |
awk '\''{print ENVIRON["ARCHIVE"] ": " $0}'\''
done' sh {} + 2> /dev/null
hangi gibi bir çıktı verir:
./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
Veya 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
}
Sadece bir dizi başka dosya formatı zip
veya tgz
kılık değiştirmiş dosyalar .jar
veya .docx
dosyalar olduğunu unutmayın. Bunları find
/ zsh
arama deseninize ekleyebilirsiniz bsdtar
, uzantıyı umursamazsınız (dosyada olduğu gibi, dosyanın türünü belirlemek için uzantıya güvenmez).
O Not *vacation*.jpg
Üzerinde eşleşir nedenle yukarıdaki, tam arşiv üye yolunda değil, sadece dosya adını eşleşir vacation.jpg
da ancak vacation/2014/file.jpg
.
Yalnızca dosya adıyla eşleşmek için, bir hile ayıklama modunu kullanmak , eşleşen dosyaların adlarını yazdırmak için -s
bir p
işaretle regexps kullanan (ikame) kullanın ve ardından hiçbir dosyanın ayıklanmadığından emin olun:
bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"
Listenin stderr üzerindeki çıktısının alınacağını ve >>
her satıra ekleneceğini unutmayın . Her durumda, bsdtar
çoğu tar
uygulama gibi, satırsonu veya ters eğik çizgi ( \n
veya olarak işlenir \\
) gibi bazı karakterler içeriyorsa ekrandaki dosya adlarını değiştirebilir .