Trích xuất dòng từ tệp trong .tar.bz2 Lưu trữ


0

Tôi muốn sử dụng stdin / stdout trên một dòng duy nhất để hiển thị phiên bản từ một tệp trong kho lưu trữ .tar.bz2 mà không ảnh hưởng đến kho lưu trữ hiện có hoặc để lại bất kỳ tệp tạm thời nào. Các tập tin chỉ có một dòng chứa phiên bản.

Các lệnh này hoạt động nhưng chúng để lại các tệp tạm thời:

cp /storage/archive.tar.bz2 /tmp/
bunzip2 /tmp/archive.tar.bz2
tar -C /tmp -xvf /tmp/archive.tar dir1/dir2/file
cat /tmp/dir1/dir2/file | grep version

Phiên bản busybox tôi đang sử dụng có bộ lệnh bị hạn chế:

# bunzip2 --help
BusyBox v1.23.2 (2017-08-22 01:34:50 UTC) multi-call binary.

Usage: bunzip2 [-cf] [FILE]...

Decompress FILEs (or stdin)

        -c      Write to stdout
        -f      Force

# tar -h
BusyBox v1.23.2 (2017-08-22 01:34:50 UTC) multi-call binary.

Usage: tar -[cxtzhvO] [-X FILE] [-T FILE] [-f TARFILE] [-C DIR] [FILE]...

Create, extract, or list files from a tar file

Operation:
        c       Create
        x       Extract
        t       List
        f       Name of TARFILE ('-' for stdin/out)
        C       Change to DIR before operation
        v       Verbose
        z       (De)compress using gzip
        O       Extract to stdout
        h       Follow symlinks
        X       File with names to exclude
        T       File with names to include

Câu trả lời:


1

Sử dụng đường ống - trên gần như tất cả các hệ điều hành gần đây, một đường ống tồn tại hoàn toàn trong bộ nhớ và không yêu cầu lưu trữ dữ liệu trung gian đầy đủ.

Phiên bản tar của bạn không có -Jtùy chọn để gọi bzip2 / bunzip2 (sẽ tự động sử dụng một đường ống phía sau hậu trường, giống như -zvậy), nhưng nó phải -f -đọc lưu trữ từ stdin. Vì vậy, bạn cần kết hợp:

  1. Yêu cầu bunzip2 ghi tệp đầu ra vào thiết bị xuất chuẩn:bunzip2 -c <file>
  2. Nói tar để đọc kho lưu trữ từ stdin:tar -x -f - ...
  3. Nói tar để ghi tập tin giải nén vào thiết bị xuất chuẩn:tar -O ...
  4. Nói với grep để đọc đầu vào từ stdin.

Kết quả là:

bunzip2 -c /storage/archive.tar.bz2 | tar -x -O -f - dir1/dir2/file | grep version

Có thể đặt một nhân vật bên cạnh -(stdin)? Tôi đang gặp vấn đề lớn ở nơi khác.
flywire

Bạn có thể vượt qua -f-như một đối số duy nhất, nhưng uh, đó là một chế độ thất bại kỳ lạ.
grawity

Vấn đề đăng bài trên diễn đàn - không lạ khi các hệ thống định dạng lại dấu gạch ngang thành dấu gạch ngang / em dash (ví dụ: từ), dù sao cũng đã -xOf-sửa nó cho mọi người
flywire
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.