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


22

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 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?


Xem thêm Làm thế nào để tôi đệ quy grep qua kho lưu trữ nén? (không phải là một bản sao chính xác, bởi vì các yêu cầu ở đó phức tạp hơn).
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


26

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 unzip 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 -acá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.


Trường hợp tùy chọn đầu tiên giải nén các tập tin đến đâu?
ngoằn ngoèo

2
unzip -cgiải nén tập tin vào thiết bị xuất chuẩn. Nó không ghi toàn bộ tập tin không nén ở bất cứ nơi nào khác.

+1 tks rất nhiều nó tiết kiệm ngày của tôi. Tôi chỉ cần thêm echo "$ file"; giải nén -c "$ file" | grep -q "ORA-1680"; để biết tên tập tin + kết quả.
Mike

2
Phiên bản của tôi unzipsử dụng -pđể phát trực tuyến đến đường ống!
gavenkoa

Điều này hoạt động khi tất cả các lệnh dòng đơn trả về "đầu ra tiêu chuẩn", không phải tên tệp +1
alimack

16

zipgrepmất một tập tin 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

2
Trong một dòng cũng in tên tệp zip nếu có kết quả for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
trùng

4

Hệ thống tệp AVFS trình bày một khung nhìn của hệ thống tệp trong đó mọi tệp lưu trữ /path/to/foo.zipcó thể truy cập dưới dạng một thư mục ~/.avfs/path/to/foo.zip#. Đây là một hệ thống tập tin FUSE , 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
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.