trích xuất tập tin duy nhất từ ​​tập tin tgz lớn


19

Tôi có một tệp tar lớn (khoảng 500G) và tôi sẽ không trích xuất chỉ một tệp từ nó.
Tuy nhiên, khi tôi chạy tar -xvf file.tgz path/to/file, có vẻ như nó vẫn đang tải toàn bộ nội dung vào bộ nhớ và mất hơn một giờ để giải nén. Tôi cũng đã thử sử dụng --exclude=ignore.txttrong đó ign.txt là danh sách các mẫu trong nỗ lực ngăn chặn nó đi qua các đường dẫn vô ích, nhưng dường như nó không hoạt động.

Có lẽ tôi không hiểu tar ... Có cách nào để nhanh chóng giải nén tập tin không?


Tôi đang tự hỏi về cùng. Tập tin tôi đang tìm kiếm được tìm thấy nhanh chóng và được trích xuất - và sau đó tôi cần đợi một giờ để phần còn lại đạt được sẽ được xử lý: o (
maasha

Câu trả lời:


14

Thật không may, để giải nén thành viên duy nhất của .tar.gzkho lưu trữ, bạn phải xử lý toàn bộ kho lưu trữ và bạn không thể làm gì nhiều để khắc phục nó.

Đây là nơi lưu trữ .zip(và một số định dạng khác như .rar) hoạt động tốt hơn nhiều, vì zipđịnh dạng có thư mục trung tâm của tất cả các tệp có trong đó với phần bù trực tiếp chỉ vào giữa ziptệp, vì vậy các thành viên lưu trữ có thể được trích xuất nhanh chóng mà không cần xử lý toàn bộ.

Bạn có thể hỏi tại sao xử lý .tar.gzquá chậm?

.tar.gz(thường được rút ngắn là .tgz) chỉ đơn giản là .tarlưu trữ nén với gzipmáy nén. gziplà máy nén trực tuyến chỉ có thể làm việc với một tập tin. Nếu bạn muốn nhận bất kỳ phần nào của gzipluồng, bạn phải giải nén toàn bộ và đây là điều thực sự giết chết nó .tar.gz(và cho .tar.bz2, .tar.xzvà các định dạng tương tự khác dựa trên .tar).

.tarđịnh dạng thực sự rất, rất đơn giản. Nó chỉ đơn giản là luồng của các tiêu đề tệp hoặc thư mục 512 byte (tên, kích thước, v.v.), mỗi tiêu đề được theo sau bởi nội dung tệp hoặc thư mục (được đệm vào kích thước khối 512 với 0 byte nếu cần). Khi bạn quan sát khối 512 hoàn toàn null cho một tiêu đề, điều này có nghĩa là kết thúc .tarlưu trữ.

Một số người nghĩ rằng ngay cả .tarcác thành viên lưu trữ không thể được truy cập nhanh chóng, nhưng điều này không hoàn toàn đúng. Nếu .tarkho lưu trữ chứa một vài tệp lớn, bạn thực sự có thể nhanh chóng tìm kiếm tiêu đề tiếp theo và do đó bạn có thể tìm thấy thành viên lưu trữ cần thiết trong vài lần tìm kiếm (nhưng vẫn có thể yêu cầu nhiều tìm kiếm như có thành viên lưu trữ). Nếu .tarkho lưu trữ của bạn chứa rất nhiều tệp nhỏ, điều này có nghĩa là việc truy xuất thành viên nhanh chóng trở nên không thể thực hiện được ngay cả đối với việc không nén .tar.


3
gzip có thể truyền dữ liệu không nén, nó không phải hoàn tác toàn bộ. Nhưng, vì .tar là viết tắt của băng lưu trữ, bạn cần phải duyệt toàn bộ tệp cho đến khi bạn tìm thấy tệp bạn đang tìm kiếm. Mặc dù tar sẽ tiếp tục tìm kiếm vì có thể có cái khác, sau đó sao chép lại trong tệp tar.
kurtm

9

Nếu bạn đang giải nén chỉ là một tập tin từ một file tar lớn, bạn đang sử dụng GNU tar, và bạn có thể đảm bảo rằng các tập tin tar chưa bao giờ được nối thêm vào sau đó bạn có thể nhận được một tăng hiệu suất đáng kể bằng cách sử dụng --occurrence.

Tùy chọn này yêu cầu tar dừng lại ngay khi tìm thấy lần xuất hiện đầu tiên của mỗi tệp bạn yêu cầu, vì vậy, vd

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

sẽ không lướt qua toàn bộ tarball sau khi nó tìm thấy một bản sao của mỗi passwdshadowthay vào đó nó sẽ dừng lại. Nếu các tệp đó xuất hiện gần cuối thì hiệu suất đạt được sẽ không nhiều, nhưng nếu chúng xuất hiện được một nửa trong một tệp 500G, bạn sẽ tiết kiệm được rất nhiều thời gian.

Đối với những người sử dụng tarđể sao lưu một lần và không sử dụng ổ đĩa băng thực sự thì tình huống này có lẽ là trường hợp điển hình.

Lưu ý rằng bạn cũng có thể vượt qua --occurrence=NUMBERđể lấy sự xuất hiện thứ SỐ của mỗi tập tin, giúp nếu bạn biết rằng có rất nhiều phiên bản trong kho lưu trữ. Theo mặc định, hành vi bằng NUMBER1.


Có cách nào để tạo tar để một tệp cụ thể xuất hiện đầu tiên không? vì vậy mà --occurrencesẽ đá ngay lập tức trên tập tin đầu tiên? Tôi đoán đó là về tên tập tin, vì vậy một cái gì đó được gọi là aaaaa.jpg sẽ xuất hiện đầu tiên chẳng hạn?
Jeff

1
@Jeff: Không hẳn. Điều này chỉ ngăn không cho tartiếp tục tìm kiếm tarball cho các phiên bản mới hơn của tệp mà nó đã tìm thấy. Thay vào đó, nó trở lại, như trang người đàn ông nói , the Nth occurrence. Nếu bạn chỉ định một tệp để giải nén trên dòng lệnh bạn nói --occurrencethì tar sẽ thoát ngay khi tìm thấy tệp đó và do đó dừng lại ở "tệp đầu tiên" một cách hiệu quả .
phogg

1

Thật không may, định dạng tệp tar không chứa mục lục tập trung - vì vậy tệp lưu trữ phải được đọc tuần tự để định vị một tệp cụ thể. Ban đầu nó được thiết kế để sao lưu băng ("tar" xuất phát từ t ape ar chive), không hỗ trợ thao tác như vậy trong mọi trường hợp.

Vì vậy, có lẽ bạn sẽ phải chờ đợi.


1

Khi giao dịch với một tarball lớn sử dụng:

--fast-readđể chỉ trích xuất mục lưu trữ đầu tiên khớp với toán hạng tên tệp, path/to/filetrong trường hợp này - luôn luôn là duy nhất trong tarball

tar -xvf file.tgz --fast-read path/to/file

ở trên sẽ tìm kiếm cho đến khi tìm thấy một trận đấu và sau đó thoát


1
Tôi muốn hiểu tại sao điều này vẫn ở 0 điểm. man tar(GNU tar 1.29) thậm chí không in tùy chọn này. Tuy nhiên, Ubuntu dường như đã kích hoạttheo mặc định . Đọc nhanh, tôi không chắc có gì --fast-readkhác --occurrence. Nhưng sau đó --occurrencethậm chí không có trên trang Ubuntu, nhưng nó nằm trong man tar. Là --fast-read--occurrenceđiều tương tự có thể?
Jeff

Cả hai tùy chọn này đều được chỉ định bởi tiêu chuẩn và, như mọi khi với các tùy chọn không chuẩn, phải cẩn thận để đảm bảo tiện ích trên hệ thống của bạn hỗ trợ chúng. Tùy chọn --occurrences được hỗ trợ bởi GNU tar. Tùy chọn --fast-read được hỗ trợ bởi các phiên bản gần đây của tar FreeBSD, được đóng gói dưới dạng bsdtar bởi Ubuntu. Xem ở đây để biết thêm.
phogg
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.