Cách trích xuất (các) tệp cụ thể từ tar.gz


105

Làm cách nào chúng tôi có thể trích xuất các tệp cụ thể từ một tệp tar.gz lớn? Tôi đã tìm thấy quá trình trích xuất các tệp từ tar trong câu hỏi này , nhưng khi tôi thử lệnh được đề cập ở đó, tôi đã gặp lỗi:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Làm thế nào để tôi trích xuất một tập tin từ tar.gz?


Lưu ý rằng bất kỳ giải pháp nào trước tiên phải giải nén toàn bộ kho lưu trữ: superuser.com/questions/655739/ Khăn Nếu bạn muốn tránh điều đó, bạn sẽ cần sử dụng định dạng khác, chẳng hạn như zip. Tuy nhiên, ZIP sẽ cho phép nén ít hơn, vì nó nén riêng từng tệp: superuser.com/questions/1013309/ Quảng cáo Tôi tự hỏi liệu có định dạng nào hỗ trợ cả tốc độ và khả năng trích xuất một tệp không.
Ciro Santilli 心 心

Câu trả lời:


119

Bạn cũng có thể dùng tar -zxvf <tar filename> <file you want to extract>

Bạn phải viết tên tệp chính xác như tar ztf test.tar.gzhiển thị nó. Nếu nó nói ví dụ ./extract11, hoặc some/bunch/of/dirs/extract11, đó là những gì bạn phải cung cấp (và tệp sẽ hiển thị dưới chính xác tên đó, các thư mục cần thiết sẽ được tạo tự động).

  • -x: hướng dẫn tar để giải nén tập tin.
  • -f: chỉ định tên tệp / tên tarball.
  • -v: Verbose (hiển thị tiến trình trong khi giải nén tập tin).
  • -z: bộ lọc lưu trữ thông qua gzip, sử dụng để giải nén các tập tin .gz.

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

1
sau đó thử điều này. tar tf archive.tar.gz | grep extract11Vui lòng kiểm tra xem extract11 có trong kho lưu trữ hay không
harish.venkat

8
Bạn phải viết tên tệp chính xác như tar ztf test.tar.gzhiển thị nó. Nếu nó nói ví dụ ./extract11, hoặc some/bunch/of/dirs/extract11, đó là những gì bạn phải cung cấp (và tệp sẽ hiển thị dưới chính xác tên đó, các thư mục cần thiết sẽ được tạo tự động).
vonbrand

Tôi muốn thêm một điểm ở đây, -ztùy chọn không hoạt động trong một số phiên bản unix như HP-UX.
Ankit Vashistha

1
@ pj-brunet: Không, fkhông được ở cuối. Nhưng nó phải được theo trực tiếp bởi tên tệp. Ví dụ này với tất cả các tùy chọn khác sau khi tên tar hoạt động tốt : tar -f mytar.tar.gz -zxv dir/somefile. Nó trích xuất "dir / somefile" từ "mytar.tar.gz".
mivk

34

Giả sử bạn có một tarball được gọi lotsofdata.tar.gzvà bạn chỉ biết có một tệp trong đó bạn muốn nhưng tất cả những gì bạn có thể nhớ là tên của nó chứa từ đó contract. Bạn có hai lựa chọn:

Sử dụng targrepliệt kê nội dung của tarball của bạn để bạn có thể tìm ra đường dẫn và tên đầy đủ của bất kỳ tệp nào khớp với phần bạn biết, sau đó sử dụng tarđể trích xuất một tệp đó bây giờ bạn biết chi tiết chính xác hoặc bạn có thể sử dụng hai tệp ít được biết đến chuyển sang chỉ trích xuất tất cả các tệp khớp với những gì bạn biết về tên tệp của mình, bạn không cần biết tên đầy đủ hoặc bất kỳ phần nào trong đường dẫn của tùy chọn này. Các chi tiết là:

lựa chọn 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Điều này sẽ liệt kê chi tiết của tất cả các tệp có tên chứa phần bạn đã biết. Sau đó, bạn trích xuất những gì bạn muốn sử dụng:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Bạn có thể cần ./ở phía trước con đường của bạn để nó hoạt động.

Tùy chọn 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Tùy thuộc vào bạn mà bạn thấy dễ dàng hơn hoặc hữu ích nhất.


Drat. Một lỗi đánh máy trên lệnh cuối cùng đó: Tôi đã nhân đôi -xzf. Chỉ nên có một ví dụ về những công tắc đó.
Wendy Cricks

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>làm việc cho tôi với sự cống hiến ./khi bắt đầu con đường đầy đủ
user13107

Bạn có thể phải kiên nhẫn với những điều này, mất một lúc ... Cũng có thể rõ ràng, nhưng nó sẽ trích xuất cấu trúc thư mục đầy đủ trong thư mục hiện tại, ngay cả khi những thư mục đó chưa tồn tại.
PJ Brunet

BSD tar (ít nhất là trên macOS) không hỗ trợ --wildcardstùy chọn. Tôi đã có thể vẫn có được hành vi tương tự với -x -O *foo. *foolà tên tệp toàn cầu trong trường hợp của tôi, vì tôi biết tệp kết thúc bằng foo.
Eric Hu

6

Tôi đã cố gắng trích xuất vài trăm tệp từ một tarball với hàng ngàn tệp vào ngày khác. Các tập tin tôi cần không thể được tham chiếu bởi một ký tự đại diện duy nhất. Vì vậy, tôi đã googled và tìm thấy trang này.

Tuy nhiên, không có thủ thuật nào ở trên có vẻ tốt cho nhiệm vụ của tôi. --files-fromCuối cùng tôi đã đọc được người đàn ông và tìm thấy tùy chọn này , vì vậy giải pháp cuối cùng của tôi là

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

và nó hoạt động như một lá bùa.

Cập nhật: Tệp danh sách phải có cùng định dạng như bạn thấy tar -tvf, nếu không, bạn sẽ không thể trích xuất bất kỳ tệp nào.


2

Ví dụ của bạn làm việc cho tôi nếu bạn bỏ qua niềng răng

$ tar --extract --file=test.tar.gz extract11

Nếu tệp trích xuất11 của bạn nằm trong thư mục con, bạn nên chỉ định đường dẫn trong tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

Sau đó, trích xuất ob11 không có trong tập tin tar. Hãy chắc chắn rằng bạn cần cung cấp đường dẫn tương đối. Xem chỉnh sửa
Bernhard

1

Vui lòng tìm bên dưới các ví dụ về trích xuất các tệp cụ thể từ tệp tar.gz.

Từ tệp cục bộ:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Từ URL từ xa:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
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.