Tôi đã tìm thấy câu hỏi Làm thế nào để xác định xem dữ liệu có phải là tệp tar hợp lệ mà không có tệp? , nhưng tôi đã tự hỏi: có giải pháp dòng lệnh được tạo sẵn không?
Tôi đã tìm thấy câu hỏi Làm thế nào để xác định xem dữ liệu có phải là tệp tar hợp lệ mà không có tệp? , nhưng tôi đã tự hỏi: có giải pháp dòng lệnh được tạo sẵn không?
Câu trả lời:
Đ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!
-z
tù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.
-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.)?
tar.gz
? Bất kỳ thông tin hỗ trợ?
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
Để 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.
bzip2 -t file.bz2
đối với các tệp bz2.
tar -t > /dev/null
(lưu ý: t
vs -t
)?
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*
> /dev/null
cho ví dụ làm việc.
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
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.
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.
Đâ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.
> 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".
-v
nếu bạn chỉ đặt đầu ra/dev/null
?