libarchive
's bsdtar
có 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 find
vớ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*jpg
tệ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ỉ zip
hoặc tgz
các tệp được ngụy trang như .jar
hoặc .docx
tệp. Bạn có thể thêm chúng vào mẫu find
/ zsh
tìm kiếm của mình , bsdtar
khô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.jpg
mà 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 p
cờ để 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, bsdtar
giống như hầu hết các tar
triể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 \n
hoặc \\
).