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 zip
tệp:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
Các -sf
tùy chọn cho zip
danh sách các tập tin chứa trong một kho lưu trữ. Sau đó, grep
sẽ tìm kiếm một .png
hoặc .jpg
ở cuối dòng ( $
). Việc -E
cho 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à -i
là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 file
trê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
, .tgz
hoặc .zip
file (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 -q
chặn đầu ra bình thường của grep, sẽ không có gì được in. Các && echo
sẽ in tên của kho lưu trữ chỉ khi grep
đã thành công.
foo
nhưng khôngfoo.png
.