Tìm và tìm kiếm bên trong tất cả các tệp nén


10

Tôi muốn quét ổ cứng của mình cho tất cả các bộ sưu tập tệp nén như zip, gzip, bzip và các loại khác và có nội dung của những loại được tìm kiếm cho một số loại tệp nhất định (chẳng hạn như hình ảnh). Chống vi-rút 'làm điều đó, vì vậy tôi tin rằng nên có một cách.


@Rinzwind sẽ tìm kiếm trong các tệp của kho lưu trữ, không nằm trong danh sách các tệp. Nó sẽ tìm thấy các tập tin có chứa foonhưng không foo.png.
terdon

Điều này có thể hữu ích để kiểm tra Zip Bomb! +1
Sharad Gautam

Câu trả lời:


18

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.


Theo câu hỏi ban đầu của tôi, tôi muốn "quét ổ cứng của mình cho tất cả các bộ sưu tập tệp nén, như zip, có chứa hình ảnh". Bạn đã giúp tìm kiếm tài liệu lưu trữ, nhưng tôi chỉ muốn xác định tài liệu lưu trữ nào chứa hình ảnh.
6ft Dan

@ 6ftDan xin lỗi, tôi đã không thấy bản gốc. Xin vui lòng quay lại hoặc chỉnh sửa lại bất kỳ chỉnh sửa nào thay đổi ý nghĩa của bài viết của bạn. Xem câu trả lời cập nhật cho cách tìm kiếm toàn bộ hệ thống tập tin.
terdon

Tuyệt vời, nhưng vì bạn đang gồng mình không nhạy cảm, có lẽ bạn cũng muốn tìm kiếm trường hợp không nhạy cảm?
kos

@kos hmm, đó là dễ dàng, đủ để làm chỉ thay đổi -nameđể -iname. Tuy nhiên, có rất ít điểm cho nó, nhiều chương trình nén (ví dụ gzip) cần phần mở rộng cụ thể. GZsẽ không làm việc
terdon

3

Không tiên tiến như terdon, nhưng điều này sẽ làm:

Lưu mã sau đây, trong một thư mục chứa tất cả mã của bạn, như finda.sh, hoặc bất kỳ tên nào khác mà bạn muốn:

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

Sau đó, trong một thư mục là tất cả các tài liệu lưu trữ của bạn, hãy chạy nó và đây là đầu ra:

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png

Theo câu hỏi ban đầu của tôi, tôi muốn "quét ổ cứng của mình cho tất cả các bộ sưu tập tệp nén, như zip, có chứa hình ảnh". Bạn đã giúp tìm kiếm tài liệu lưu trữ, nhưng tôi chỉ muốn xác định tài liệu lưu trữ nào chứa hình ảnh.
6ft Dan

@ 6ftDan Điều đó, tôi nghĩ là có thể, nhưng có thể mất một lúc. Đồng thời, tôi đã thêm một số cải tiến vào kịch bản của mình, nhờ sự giúp đỡ của terdon.
lưỡi19899

Lưu ý rằng *.*sẽ chỉ khớp các tệp với một phần mở rộng. Ngoài ra, điều này sẽ liệt kê tất cả các tệp trong tất cả các tài liệu lưu trữ, bạn không kiểm tra bất kỳ loại tệp nào.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.