libarchive's bsdtardapat menangani sebagian besar dari mereka format file, sehingga Anda bisa melakukan:
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
Yang dapat Anda sederhanakan (dan tingkatkan agar sesuai dengan kasus-tidak sensitif) dengan GNU finddengan:
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
Itu tidak mencetak jalur arsip tempat *vacation*jpgfile - file itu ditemukan. Untuk mencetak nama itu, Anda dapat mengganti baris terakhir dengan:
-exec sh -ac '
for ARCHIVE do
bsdtar tf "$ARCHIVE" "*vacation*jpg" |
awk '\''{print ENVIRON["ARCHIVE"] ": " $0}'\''
done' sh {} + 2> /dev/null
yang memberikan output seperti:
./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
Atau dengan 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
}
Perhatikan bahwa ada sejumlah format file lain yang hanya zipatau tgzfile dalam suka .jaratau .docxfile. Anda dapat menambahkannya ke find/ zshpola pencarian Anda, bsdtartidak peduli tentang ekstensi (seperti pada, itu tidak bergantung pada ekstensi untuk menentukan jenis file).
Perhatikan bahwa di *vacation*.jpgatas cocok dengan jalur anggota arsip lengkap, bukan hanya nama file, sehingga akan cocok pada vacation.jpgtetapi juga pada vacation/2014/file.jpg.
Untuk mencocokkan hanya pada nama file, satu trik adalah dengan menggunakan mode ekstrak , gunakan -s(substitusi) yang menggunakan regexps dengan pbendera untuk mencetak nama file yang cocok dan kemudian pastikan tidak ada file yang diekstraksi, seperti:
bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"
Perhatikan bahwa ini akan menampilkan daftar pada stderr dan menambahkan >>ke setiap baris. Dalam kasus apa pun bsdtar, seperti kebanyakan tarimplementasi dapat memotong nama file pada layar jika mengandung beberapa karakter seperti baris baru atau garis miring terbalik (diterjemahkan sebagai \natau \\).