Kiểm tra tính toàn vẹn của tệp tar trong bash


25

Tôi có một tập lệnh bash tạo tệp '.tar'. Khi tệp được tạo, tôi muốn kiểm tra tính toàn vẹn của nó và gửi email đến người dùng root nếu tính toàn vẹn là xấu.

Tôi biết tôi sẽ cần sử dụng lệnh tar -tf /root/archive.tarđể kiểm tra tính toàn vẹn của tệp, nhưng làm thế nào để tôi thực hiện điều này trong một bash if statement và kiểm tra lỗi?

Câu trả lời:


33

Nếu tartìm thấy lỗi trong đầu vào của nó, nó sẽ exit(3)với giá trị thoát khác không. Điều này - với hầu hết các tartriển khai - cũng được thực hiện khi liệt kê nội dung lưu trữ với t. Vì vậy, bạn có thể chỉ cần kiểm tra giá trị thoát của tarđể xác định xem có lỗi gì không:

if ! tar tf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

Nếu bạn tarkhông tìm thấy tất cả các lỗi với t, bạn vẫn có thể trích xuất kho lưu trữ stdoutvà chuyển hướng stdoutđến /dev/null, đó sẽ là cách tiếp cận chậm hơn nhưng đáng tin cậy hơn:

if ! tar xOf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

Ký hiệu này biểu thị trang chủ, không phải cuộc gọi thực tế. Xem man 3 exit.


1
Bạn có thể muốn chuyển hướng tarđầu ra /dev/null, vì có lẽ bạn không thực sự muốn nhìn thấy nó.
Kevin

1
Không phải tất cả các tartriển khai đều phát hiện hoặc báo cáo tất cả các lỗi với t( bsdtarkhông, bạn có thể sử dụng tar xOf file.tar > /dev/nullở đó). Không phải tất cả các tartriển khai sẽ thoát với trạng thái thoát 2, star(255) ot bsdtar(1) không, nhưng điều quan trọng là trạng thái thoát là khác không ở đây.
Stéphane Chazelas

1
Tôi chỉnh sửa bài viết của tôi cho phù hợp. Với exit(2)tôi liên quan đến trang chủ thích hợp, không phải giá trị thoát chính xác (đó là lý do tại sao tôi có »khác không« được đề cập rõ ràng trong câu sau). Chú thích điều này (và thay đổi phần bên phải -.-).
Andreas Wiese

câu trả lời của bạn chỉ là về khả năng liệt kê và trích xuất, nếu tôi mở kho lưu trữ tar bằng trình chỉnh sửa và thay đổi thứ gì đó thì giải pháp của bạn sẽ không gặp phải bất kỳ lỗi nào ... xin lỗi
THESorcerer

0

xin lỗi, nhưng bạn không thể, có vẻ như tar thiếu khả năng kiểm tra (ví dụ nếu bạn quên * nix và thử kiểm tra nó với winrar, kết quả sẽ là: "Lệnh không được hỗ trợ cho loại lưu trữ này")

Làm thế nào tôi đã chỉ ra trong các nhận xét ở trên, tar thực sự thiếu CRC nội bộ để có một thuật ngữ so sánh, do đó, nếu bạn thay đổi một kho lưu trữ tar bằng trình chỉnh sửa, việc liệt kê và trích xuất có thể hoạt động hoàn hảo không có lỗi, nhưng trích xuất dữ liệu bị hỏng

Để kết luận, tôi kết thúc ở đây hy vọng cho một giải pháp, nhưng không có một, may mắn thay, có hai tin tốt:

có rất nhiều, rất, RẤT lưu trữ tar hiếm mà cũng không được nén với một chương trình khác (như gzip, bzip2, v.v.) vì vậy chương trình đó sẽ có một giải pháp thử nghiệm và những người không nén chúng là khập khiễng, THỰC SỰ LAME

Đối với vấn đề cá nhân của tôi, tôi may mắn, sau khi giải nén nó, tôi chỉ tìm thấy một tệp md5sum với CRC của tất cả các tệp bên trong (ngay cả người đã đưa tar arhive lên mạng và không muốn nén nó, anh ta vẫn muốn có thể được xác minh)


-5

Bạn có thể làm điều đó bằng cách chuyển các đối số sau đây cho tar:

$ tar -cvzf test.tar test_file

2
Câu trả lời một dòng thường không hữu ích. Xem xét mở rộng bài đăng của bạn để bao gồm một số tài liệu nguồn (ví dụ: tài liệu) hỗ trợ giải pháp của bạn.
HalosGhost

6
-ctạo tập tin có tên thông qua -f('test.tar'). -zgzips lưu trữ. -vlàm cho nó dài dòng Tôi khá chắc chắn rằng đây không phải là một giải pháp chính xác.
EpicVoyage
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.