libarchive's bsdtarcó thể xử lý hầu hết các định dạng tập tin, vì vậy bạn có thể làm:
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
Mà bạn có thể đơn giản hóa (và cải thiện để khớp với trường hợp không nhạy cảm) với GNU findvới:
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
Điều đó không in đường dẫn của kho lưu trữ nơi các *vacation*jpgtệp được tìm thấy mặc dù. Để in tên đó, bạn có thể thay thế dòng cuối cùng bằng:
-exec sh -ac '
for ARCHIVE do
bsdtar tf "$ARCHIVE" "*vacation*jpg" |
awk '\''{print ENVIRON["ARCHIVE"] ": " $0}'\''
done' sh {} + 2> /dev/null
cung cấp một đầu ra như:
./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
Hoặc với 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
}
Lưu ý rằng có một số định dạng tệp khác chỉ ziphoặc tgzcác tệp được ngụy trang như .jarhoặc .docxtệp. Bạn có thể thêm chúng vào mẫu find/ zshtìm kiếm của mình , bsdtarkhông quan tâm đến tiện ích mở rộng (như trong, nó không dựa vào tiện ích mở rộng để xác định loại tệp).
Lưu ý rằng *vacation*.jpgở trên được khớp trên đường dẫn thành viên lưu trữ đầy đủ, không chỉ tên tệp, vì vậy nó sẽ khớp trên vacation.jpgmà còn trên vacation/2014/file.jpg.
Để chỉ khớp với tên tệp, một mẹo là sử dụng chế độ giải nén , sử dụng -s(thay thế) sử dụng biểu thức chính quy với pcờ để in tên của các tệp phù hợp và sau đó đảm bảo không có tệp nào được trích xuất, như:
bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"
Lưu ý rằng nó sẽ xuất danh sách trên stderr và nối >>vào mỗi dòng. Trong mọi trường hợp, bsdtargiống như hầu hết các tartriển khai có thể xáo trộn tên tệp được hiển thị nếu chúng chứa một số ký tự như dòng mới hoặc dấu gạch chéo ngược (được hiển thị dưới dạng \nhoặc \\).