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.txt
mà không thực sự giải nén a.tar
.
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.txt
mà không thực sự giải nén a.tar
.
Câu trả lời:
Đây có thể là một tùy chọn cụ thể của GNU, nhưng bạn có thể sử dụng -O
hoặ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
tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --O
khi 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
$ tar -axf file.tgz foo/bar -O
Đ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
Đ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 đã lesspipe
cài đặt và nếu biến env LESSOPEN
được định nghĩa là | /usr/bin/lesspipe.sh %s
dự kiến nếu bạn có lesspipe cài đặt đúng.
lesspipe.sh
có lẽ nên được ưu tiên.
Ồ, nhưng đây là một câu hỏi về nội dung của một tập tin trong một tar
tậ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 tar
tệ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 dd
và shell script có thể tar
tạ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 tar
tệ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 cut
trườ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 tar
tệp chỉ chứa các tệp văn bản vì tar
cá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 tar
hoạ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 tar
loạ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 tar
kho 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 size
tiê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 size
byte 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 size
trườ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:
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 tar
tệ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:
size
lĩnh vực là kích thước của các tập tin trong octet.
typeflag
trườ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 ) , size
trường sẽ được chỉ định là 0.typeflag
trường được đặt để chỉ định tệp loại 5 ( thư mục ) , size
trường sẽ được hiểu như được mô tả theo định nghĩa của loại bản ghi đó.typeflag
trườ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 size
trườ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.size
trường sẽ bị bỏ qua khi đọc.typeflag
trườ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 tar
s 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 chksum
trường và xác minh tệp bạn nghĩ rằng bạn thực sự là tệp bạn muốn. tar
Mặc dù chksum
khá đơn giản-
chksum
lĩ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, chksum
trườ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?