Cách tiếp cận đơn giản nhất sẽ là liệt kê nội dung của kho lưu trữ và tìm kiếm các tệp của phần mở rộng có liên quan. Ví dụ: với một ziptệp:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
Các -sftùy chọn cho zipdanh sách các tập tin chứa trong một kho lưu trữ. Sau đó, grepsẽ tìm kiếm một .pnghoặc .jpgở cuối dòng ( $). Việc -Echo phép các biểu thức chính quy mở rộng, vì vậy chúng ta có thể sử dụng |làm OR và -ilàm cho trường hợp khớp không nhạy cảm.
Tuy nhiên, mỗi công cụ lưu trữ có một lệnh khác nhau để liệt kê nội dung. Tôi đã viết một kịch bản có thể đối phó với hầu hết các kịch bản phổ biến hơn. Nếu bạn lưu tập lệnh đó dưới dạng list_compressed.sh, thì bạn có thể chạy:
list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
Điều đó sẽ cho bạn thấy các loại hình ảnh phổ biến nhất. Lưu ý rằng phương pháp này giả định rằng loại tệp có thể được xác định bởi phần mở rộng của tệp. Nó sẽ không tìm thấy các tệp hình ảnh không có phần mở rộng và nó sẽ không nhận ra các tệp có phần mở rộng sai. Không có cách nào để đối phó với điều đó mà không thực sự trích xuất các tệp từ kho lưu trữ và chạy filetrên mỗi tệp.
Nếu bạn muốn tìm tất cả các tài liệu lưu trữ có chứa tệp hình ảnh trên ổ cứng của mình, hãy kết hợp phần trên với find:
find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
while IFS= read -r -d '' arch; do
list_compressed.sh "$arch" |
grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
echo "$arch contains image(s)"
done
Lệnh find sẽ tìm kiếm cho tất cả .gz, .tgzhoặc .zipfile (bạn có thể thêm bao nhiêu phần mở rộng theo ý muốn), sau đó những người được chuyển qua kịch bản của tôi. Việc -qchặn đầu ra bình thường của grep, sẽ không có gì được in. Các && echosẽ in tên của kho lưu trữ chỉ khi grepđã thành công.
foonhưng khôngfoo.png.