libarchive
's bsdtar
dapat 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 find
dengan:
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*jpg
file - 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 zip
atau tgz
file dalam suka .jar
atau .docx
file. Anda dapat menambahkannya ke find
/ zsh
pola pencarian Anda, bsdtar
tidak peduli tentang ekstensi (seperti pada, itu tidak bergantung pada ekstensi untuk menentukan jenis file).
Perhatikan bahwa di *vacation*.jpg
atas cocok dengan jalur anggota arsip lengkap, bukan hanya nama file, sehingga akan cocok pada vacation.jpg
tetapi 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 p
bendera 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 tar
implementasi dapat memotong nama file pada layar jika mengandung beberapa karakter seperti baris baru atau garis miring terbalik (diterjemahkan sebagai \n
atau \\
).