Làm cách nào để kiểm tra xem tệp Unix .tar.gz có phải là tệp hợp lệ hay không mà không cần giải nén?


Câu trả lời:


121

Điều gì về việc chỉ nhận được một danh sách của tarball và loại bỏ đầu ra, thay vì giải nén tệp?

tar -tzf my_tar.tar.gz >/dev/null

Đã chỉnh sửa theo nhận xét. Cảm ơn zrajm!

Chỉnh sửa theo nhận xét. Cảm ơn Frozen Flame! Kiểm tra này không bao hàm tính toàn vẹn của dữ liệu. Bởi vì nó được thiết kế như một tiện ích lưu trữ băng, hầu hết các triển khai của tar sẽ cho phép nhiều bản sao của cùng một tệp!


13
Tại sao lại sử dụng -vnếu bạn chỉ đặt đầu ra /dev/null?
zrajm

2
Đúng @zrajm. Đoán đó là trí nhớ cơ bắp của tôi khởi động! (-:
Rob Wells

5
Các -ztùy chọn cũng được không cần thiết. Nó không làm gì ở chế độ trích xuất hoặc danh sách.
asmeurer

1
@asmeurer Re: -zĐó chắc chắn là trường hợp của GNU tar - bạn có biết điều này có đúng ở nơi khác không (BSD, v.v.)?
belacqua

2
@bobwells Nhưng có phải giải nén thành công hoặc liệt kê các tệp nội dung ngụ ý tính toàn vẹn dữ liệu của tar.gz? Bất kỳ thông tin hỗ trợ?
Frozen Flame,

99

bạn có thể sử dụng tùy chọn gzip -t để kiểm tra tính toàn vẹn của tệp

http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

từ: http://unix.ittoolbox.com/groups/technical-f Chức năng/shellscript-l/how-to-test-file-integrity-of-targz-1138880

Để kiểm tra tệp gzip không bị hỏng:

gunzip -t file.tar.gz

Để kiểm tra tệp tar bên trong không bị hỏng:

gunzip -c file.tar.gz | tar -t > /dev/null

Là một phần của bản sao lưu, bạn có thể chỉ cần chạy lệnh sau và kiểm tra giá trị của $? sau đó cho giá trị 0 (thành công). Nếu tar hoặc gzip có vấn đề, $? sẽ có giá trị khác 0.


3
bzip2 -t file.bz2đối với các tệp bz2.
asmeurer

4
Đây không phải là chỉ sử dụng hai lệnh để làm những gì "tar -tzf my_tar.tar.gz> / dev / null" làm?
Rob Wells

Nó không phải là tar -t > /dev/null(lưu ý: tvs -t)?
Intrastellar Explorer

1
@IntrastellarExplorer đó là lỗi đánh máy của tôi, mặc dù nó vẫn hoạt động mà không có dấu gạch nối. Tôi chỉ quen với các tùy chọn kiểu cũ trên tar. unix.stackexchange.com/questions/394060/…
John Boker

32

Nếu bạn muốn thực hiện kiểm tra thực sự giải nén tệp tar mà không cần giải nén vào đĩa, hãy sử dụng tùy chọn -O. Thao tác này sẽ giải nén thành đầu ra tiêu chuẩn thay vì hệ thống tệp. Nếu tệp tar bị hỏng, quá trình sẽ dừng lại với lỗi.

Ví dụ về thử nghiệm bóng tar không thành công ...

$ echo "this will not pass the test" > hello.tgz
$ tar -xvzf hello.tgz -O > /dev/null
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
$ rm hello.*

Ví dụ làm việc ...

$ ls hello*
ls: hello*: No such file or directory
$ echo "hello1" > hello1.txt
$ echo "hello2" > hello2.txt
$ tar -cvzf hello.tgz hello[12].txt
hello1.txt
hello2.txt
$ rm hello[12].txt
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz -O
hello1.txt
hello1
hello2.txt
hello2
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz
hello1.txt
hello2.txt
$ ls hello*
hello1.txt  hello2.txt  hello.tgz
$ rm hello*

1
Đối với tôi, có vẻ như bài kiểm tra tốt nhất là bài kiểm tra này. Nó thực sự trích xuất từng tệp và đảm bảo không có lỗi.
tay áo

Thực sự hữu ích. Tôi đã thực hiện một kịch bản shell, thêm một móc lập luận để thông qua đường dẫn của tập tin và đặt nó trong con đường của tôi :) [tar xvzf $ 1 -O> / dev / null]
smonff

@sleeves Tại sao bạn nghĩ rằng nó tốt hơn câu trả lời được chấp nhận? tar -tvzf hello.tgz> / dev / null cũng cho lỗi tương tự.
dash17291

5
@ dash17291 Tôi nói điều này vì tôi cho rằng đây là một bài toán khó để chứng minh rằng đối với mọi trường hợp, a -tvf sẽ bắt được tất cả các lỗi hoặc hỏng hóc mà a -xvf. Nói cách khác, -xvf sẽ bắt tất cả những điều đó -tvf, nhưng tôi không thể nói điều ngược lại là đúng.
tay áo

Có lẽ bạn cũng nên sử dụng > /dev/nullcho ví dụ làm việc.
moi

12

Bạn cũng có thể kiểm tra nội dung của tệp * .tag.gz bằng cách sử dụng pigz(gzip song song) để tăng tốc độ kiểm tra lưu trữ:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null

Điểm chuẩn nhỏ: chạy nó với pigz -cvd: 80s, trong khi chạy với answer tar -tzv: 143s được chấp nhận trên kho lưu trữ 22G.
Wadih M.

làm cách nào để xóa thông báo khỏi cronjob về "tar: Xóa đầu` / 'khỏi tên thành viên "khi sử dụng phương pháp này?
MaXi32

3

Tôi đã thử lệnh sau và chúng hoạt động tốt.

bzip2 -t file.bz2
gunzip -t file.gz

Tuy nhiên, chúng ta có thể thấy hai lệnh này rất tốn thời gian. Có lẽ chúng ta cần một số cách nhanh hơn để xác định tính nguyên vẹn của các tệp nén.


2

Một tùy chọn hay là sử dụng tùy chọn này để tar -tvvf <filePath>thêm một dòng báo cáo loại tệp.

Ví dụ trong tệp .tar hợp lệ:

> tar -tvvf filename.tar 
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:46 ./testfolder2/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:46 ./testfolder2/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:46 ./testfolder2/.DS_Store
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:42 ./testfolder2/testfolder/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:42 ./testfolder2/testfolder/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:42 ./testfolder2/testfolder/.DS_Store
-rw-r--r--  0 diegoreymendez staff  325377 Jul  5 09:50 ./testfolder2/testfolder/Scala.pages
Archive Format: POSIX ustar format,  Compression: none

Tệp .tar bị hỏng:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.

Điều này xảy ra trên tar BSD nhưng không xảy ra trên GNU tar.
mcallister

1

Đây là tất cả các giải pháp rất tối ưu. Từ thông số GZIP

ID2 (Nhận dạng 2)
Các giá trị này có các giá trị cố định ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), để xác định tệp đang ở định dạng gzip.

Phải được mã hóa thành bất kỳ ngôn ngữ nào bạn đang sử dụng.


nếu tệp đã bị cắt ngắn, điều đó dường như yêu cầu giải nén đầy đủ để phát hiện
philwalk

0

> sử dụng tùy chọn -O. [...] Nếu tệp tar bị hỏng, quá trình sẽ dừng lại do lỗi.

Đôi khi có, nhưng đôi khi không. Hãy xem một ví dụ về tệp bị hỏng:

echo Pete > my_name
tar -cf my_data.tar my_name 

# // Simulate a corruption
sed < my_data.tar 's/Pete/Fool/' > my_data_now.tar
# // "my_data_now.tar" is the corrupted file

tar -xvf my_data_now.tar -O

Nó cho thấy:

my_name
Fool  

Ngay cả khi bạn thực hiện

echo $?

tar nói rằng không có lỗi:

0

nhưng tệp đã bị hỏng, bây giờ nó có "Fool" thay vì "Pete".


Mọi người hiếm khi sử dụng tệp tar mà không có bất kỳ nén nào. Tôi đoán nhận xét của bạn chỉ liên quan đến các tệp không nén.
Jarekczek

6
Bạn đang nhầm lẫn giữa liêm chính với tham nhũng. Tệp của bạn đã mất tính toàn vẹn nhưng nó vẫn là định dạng lưu trữ được chấp nhận.
Phil
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.