Xem một tập tin trong một kho lưu trữ tar mà không cần giải nén nó


16

Tôi muốn xem nội dung của tệp tarred mà không giải nén nó, Kịch bản: Tôi có a.tar và bên trong có một tệp được gọi ./x/y.txt. Tôi muốn xem nội dung y.txtmà không thực sự giải nén a.tar.


Nếu bạn sử dụng Emacs, bạn chỉ cần mở tarball trong đó.
Qudit

Er, để xem nó, bạn phải giải nén nó. Tôi đoán ý của bạn là "không ghi nó vào tập tin"?
Toby Speight

Câu trả lời:


20

Đây có thể là một tùy chọn cụ thể của GNU, nhưng bạn có thể sử dụng -Ohoặc --to-stdoutđể trích xuất các tệp thành đầu ra tiêu chuẩn

$ tar -axf file.tgz foo/bar -O

Ah hoạt động, nhưng tôi đã không quản lý để in đầu ra trên các dòng mới. Ví dụ; tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --Okhi ví dụ, nhiều tập tin phù hợp *read_this_file*. Tất cả mọi thứ được in trên cùng một dòng. Từ man, tôi tìm thấy --to-command. Vì vậy, Passing --to-command="echo '' && cat"là một chút ma thuật đen nhưng nó hoạt động: D
GabLeRoux

Chỉ cần điều này là cần thiết trong câu trả lời:$ tar -axf file.tgz foo/bar -O
user1742529

12

Điều này in nội dung của ./x/y.txt từ a.tar sang STDOUT.

tar xfO a.tar ./x/y.txt


2
gợi ý: đó là một chữ "o", không phải bằng không.
Hubert Grzeskowiak

4

Điều này đơn giản như

less  a.tar:./x/y.txt

Bí quyết kỳ diệu này hoạt động nếu bạn đã lesspipecài đặt và nếu biến env LESSOPENđược định nghĩa là | /usr/bin/lesspipe.sh %sdự kiến nếu bạn có lesspipe cài đặt đúng.


Đó là một kịch bản tuyệt vời - nhưng có nhiều hơn một. Theo tôi hiểu, điều nàylesspipe.sh có lẽ nên được ưu tiên.
mikeerv

Điều đó sẽ làm việc trên tarball nén?
terdon

Nó nên. Nhưng tôi chỉ thấy nó không hoạt động trong Ubuntu. Đi hình. Họ đã phá vỡ hoặc loại bỏ các tính năng. Bạn vẫn có thể xem danh sách lưu trữ với ít nội dung nhưng không phải tệp :-(
solsTiCe

2

Ồ, nhưng đây là một câu hỏi về nội dung của một tập tin trong một tartập tin. Và thực tế, trong một số trường hợp, điều này không quá khó. Vấn đề là, một tartệp chỉ là một tệp luồng bị chặn - mỗi tệp trong kho lưu trữ được tìm thấy sau tệp trước đó và mỗi tệp có một tiêu đề siêu dữ liệu dựa trên định dạng được chỉ định .

Dựa trên định dạng đó, tôi đã từng viết shitar- đó là một vài dòng ddvà shell script có thể tartạo ra một luồng các thiết bị khối đang hoạt động. Dựa trên cùng, gần đây tôi đã viết một vài dòng mã :

tar --no-recursion -c ./      |
{ printf \\0; tr -s \\0; }    |
cut -d '' -f-2,13             |
tr '\0\n' '\n\t'

... Để chọn một tartệp nhanh chóng và thực hiện chuyển đổi nội tuyến trên các tệp văn bản thành phần của nó. Ở đó các cuttrường trỏ đến các trường 1,2,13 của một dòng đầu vào được phân tách bằng NUL . Những điều như vậy thật dễ dàng khi tartệp chỉ chứa các tệp văn bản vì tarcác dấu phân cách bản ghi (như có thể xảy ra một lần sau mỗi 512 byte) chỉ có thể được nén xuống một NUL mỗi lần và loại bỏ - mà không yêu cầu bạn phải đếm số lần xuất hiện như bạn làm.

tarĐịnh dạng tiêu đề của nó trông như thế này:

field    offset   len
name     0        100
mode     100      8
uid      108      8
gid      116      8
size     124      12
mtime    136      12
chksum   148      8
typeflag 156      1
linkname 157      100
magic    257      6
version  263      2
uname    265      32
gname    297      32
devmajor 329      8
devminor 337      8
prefix   345      155

Hiểu rằng có một độ dốc lớn giữa sự dễ dàng tương đối để xử lý các tarhoạt động đơn giản với các khía cạnh phức tạp hơn nhiều của định dạng lưu trữ. Mặc dù những điều đơn giản - như đóng gói một nhóm nhỏ các tệp được gõ đồng nhất với nhau hoặc thậm chí tách ra một kho lưu trữ chỉ chứa các thành viên mà bạn có thể dự đoán - có thể dễ dàng thực hiện với một vài ống vỏ, xử lý đáng tin cậy các thành viên lưu trữ tùy ý không phải là vấn đề.

Điều này đặc biệt khó khăn khi các thành viên đó có thể chứa dữ liệu nhị phân tùy ý - điều này chắc chắn sẽ loại trừ bất kỳ ứng dụng đáng tin cậy nào tr -s- và khó khăn này chỉ hợp chất khi các tệp thuộc nhiều loại khác ngoài thông thường và / hoặc bảng mã khác với dữ liệu gốc của bạn được sử dụng và / hoặc kho lưu trữ ban đầu được tạo bởi một triển khai với các đặc điểm riêng của ứng dụng định dạng mà bạn không chuẩn bị để xử lý. Và điều này chỉ chạm vào các khía cạnh cơ bản, được tiêu chuẩn hóa của tarloại lưu trữ - thêm vào các tiêu đề mở rộng và định dạng mở rộng và các tệp thưa thớt và nén và ... tốt, chúc may mắn với những điều đó.

Tuy nhiên, quay lại vấn đề cơ bản, kích thước bản ghi tiêu chuẩn cho tarkho lưu trữ là 20 khối - hoặc 10240 byte. Tuy nhiên, do một kho lưu trữ bị chặn trên kích thước bản ghi tiêu chuẩn và chỉ chứa các loại tệp tiêu chuẩn và tiêu ustarđề tiêu chuẩn , bạn nên bỏ qua từ tiêu đề thành viên đến tiêu đề thành viên bằng cách đọc theo trường sizetiêu đề cho đến khi bạn tìm thấy một thành viên phù hợp với mà bạn tìm kiếm Khi đó, hãy đọc theo sizebyte từ phần bù bắt đầu ở phần đuôi của tiêu đề thành viên của mục tiêu. Và đó là tập tin của bạn.

Tuy nhiên, bỏ qua các tiêu đề không phải là quá dễ dàng. Các loại khác nhau sẽ hoặc sẽ không có các khối dữ liệu thực tế được nối thêm tương ứng size. Ví dụ: thư mục và liên kết sẽ không chứa khối dữ liệu đó, chỉ có mô tả tiêu đề và do đó bạn phải chuẩn bị để xác minh loại tệp của tiêu đề hiện tại trước khi xác định chính xác liệu bạn có nên áp dụng sizetrường của nó cho công thức bỏ qua của mình hay không.

Ngoài ra, các yếu tố kích thước bản ghi - tùy thuộc vào việc kích thước của các thành viên lưu trữ có đồng bộ hóa tốt với bản ghi tiêu chuẩn 10240 hay không - có thể có thêm một khối 0 bổ sung cho mỗi khối. Và kích thước bản ghi có thể được khai báo tại thời điểm tạo lưu trữ - và do đó, nó thậm chí có thể không phải là 20 khối, mặc dù, theo thông số kỹ thuật, nó phải luôn bị chặn trên các đơn vị 512 byte:

  • ustar
    • Các tarđịnh dạng trao đổi; xem phần MÔ TẢ TUYỆT VỜI . Kích thước khối mặc định cho định dạng này cho các tệp lưu trữ đặc biệt của ký tự sẽ là 10240 . Việc triển khai sẽ hỗ trợ tất cả các giá trị kích thước nhỏ hơn hoặc bằng 32256 là bội số của 512 .

Vì vậy, nếu bạn đang làm việc với một tartệp có thể chứa các tệp có thể chứa dữ liệu nhị phân tùy ý, bạn sẽ phải bỏ qua tệp theo thuật toán và theo filetype. Thông số kỹ thuật nói:

  • Các sizelĩnh vực là kích thước của các tập tin trong octet.
    • Nếu typeflagtrường được đặt để chỉ định tệp thuộc loại 1 ( liên kết ) hoặc 2 ( liên kết tượng trưng ) , sizetrường sẽ được chỉ định là 0.
    • Nếu typeflagtrường được đặt để chỉ định tệp loại 5 ( thư mục ) , sizetrường sẽ được hiểu như được mô tả theo định nghĩa của loại bản ghi đó.
    • Không có bản ghi logic dữ liệu được lưu trữ cho loại 1 , 2 hoặc 5 .
    • Nếu typeflagtrường được đặt thành 3 ( tệp đặc biệt ký tự ) , 4 ( tệp đặc biệt khối ) hoặc 6 ( FIFO ) , thì ý nghĩa của sizetrường không được xác định bởi tập POSIX.1-2008 này và không có bản ghi logic dữ liệu nào lưu trữ trên phương tiện.
    • Ngoài ra, đối với loại 6 , sizetrường sẽ bị bỏ qua khi đọc.
  • Nếu typeflagtrường được đặt thành bất kỳ giá trị nào khác, số lượng các bản ghi logic được viết sau tiêu đề sẽ là , bỏ qua bất kỳ phân số nào trong kết quả của phép chia.( (size+ 511 ) / 512 )

... Và, tất nhiên, cũng xem xét kích thước riêng của từng tiêu đề - là một khối bổ sung cho mỗi thành viên. Vì vậy, bạn có thể bỏ qua việc đọc bằng cách đọc từ tiêu đề đến tiêu đề cho đến khi bạn tìm được một tiêu đề phù hợp với tiêu đề mà bạn tìm kiếm, lúc đó bạn sẽ cần kiểm tra xem bản ghi hiện tại chỉ mô tả một liên kết đến tệp của bạn hoặc với tệp thực tế . Điều này đặc biệt có liên quan vì khi cùng một tệp được thêm vào kho lưu trữ nhiều lần, nhiều tars sẽ chỉ bao gồm các tiêu đề liên kết vì dữ liệu của tệp thực tế có thể được tìm thấy ở nơi khác trong kho lưu trữ.

Đã xác minh rằng bạn sẽ cần áp dụng các tính toán của mình cho chksumtrường và xác minh tệp bạn nghĩ rằng bạn thực sự là tệp bạn muốn. tarMặc dù chksumkhá đơn giản-

  • cksum
    • Các chksumlĩnh vực được các tiêu chuẩn ISO / IEC 646: 1991 tiêu chuẩn Irv đại diện của các giá trị bát phân của số tiền đơn giản của tất cả các octet trong hồ sơ logic tiêu đề. Mỗi octet trong tiêu đề sẽ được coi là một giá trị không dấu. Các giá trị này sẽ được thêm vào một số nguyên không dấu, được khởi tạo thành 0, độ chính xác không nhỏ hơn 17 bit. Khi tính toán tổng kiểm tra, chksumtrường được xử lý như thể tất cả các ký tự <dấu cách> .

Tất nhiên, bạn thực sự sẽ không phải làm bất cứ điều gì, bởi vì tarđã có thể làm điều đó - đó là những gì nó làm - và vì vậy bạn có lẽ chỉ nên sử dụng nó để tìm kiếm kho lưu trữ và giải nén tệp cho bạn. Khi làm như vậy, nó sẽ không làm bất cứ điều gì khác biệt so với bạn sẽ làm nếu bạn biết bạn đang làm gì, ngoại trừ việc nó có thể sẽ làm tốt hơn và nhanh hơn vì đó là công việc của nó. Và dù sao, tại sao bạn nên?


0

Bạn có thể sử dụng dòng này

tar -axf a.tar -O

3
Điều này sẽ hiển thị bất kỳ tệp nào có trong tar, không chỉ y.txtvà không rõ ràng trong câu hỏi của OP đó là tệp duy nhất trong tar.
Anthon
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.