it-swarm-vi.com

Tìm kiếm một chuỗi trên nhiều tệp Zip

Tôi đang làm việc trên SunOS 5.10. Tôi có một thư mục chứa khoảng 200 tệp Zip. Mỗi tệp Zip chỉ chứa một tệp văn bản trong đó. Tôi muốn tìm kiếm một chuỗi cụ thể trong tất cả các tệp văn bản trong tất cả các tệp Zip.

Tôi đã thử điều này (tìm kiếm bất kỳ tệp văn bản nào trong tệp Zip có chứa chuỗi "ORA-") nhưng nó không hoạt động.

zipgrep ORA-1680 *.Zip

Điều gì là chính xác để làm điều đó mà không giải nén các tập tin Zip?

25
ziggy

Nói chung, không thể tìm kiếm nội dung trong một tệp nén mà không giải nén nó bằng cách này hay cách khác. Vì zipgrep chỉ là một shellscript, gói giải nén và egrep, nên bạn cũng có thể thực hiện thủ công:

for file in *.Zip; do unzip -c "$file" | grep "ORA-1680"; done

Nếu bạn chỉ cần danh sách các tệp Zip phù hợp, bạn có thể sử dụng một cái gì đó như:

for file in *.Zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

Bằng cách này, bạn chỉ giải nén thành thiết bị xuất chuẩn (tức là vào bộ nhớ) thay vì giải nén các tệp vào đĩa. Tất nhiên bạn có thể cố gắng chỉ grep -a các tệp Zip nhưng tùy thuộc vào nội dung của tệp và mẫu của bạn, bạn có thể nhận được dương tính giả và/hoặc phủ định sai.

27
Noah

zipgrep lấy một tệp duy nhất. Để làm cho nó hoạt động trên nhiều tệp, đặt nó trong một vòng lặp:

for i in *.Zip
do
   zipgrep ORA-1680 "$i"
done
18
dogbane

AVFS hệ thống tập tin trình bày chế độ xem của hệ thống tệp trong đó mọi tệp lưu trữ /path/to/foo.Zip có thể truy cập dưới dạng thư mục ~/.avfs/path/to/foo.Zip#. Đó là Fuse hệ thống tập tin mà bạn có thể cài đặt trên Solaris. AVFS cung cấp quyền truy cập chỉ đọc vào hầu hết các định dạng tệp lưu trữ phổ biến.

mountavfs
for z in ~/.avfs$PWD/*.Zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional