Có phương pháp dòng lệnh nào để tôi có thể kiểm tra xem một tệp đã tải xuống đã hoàn thành hay bị hỏng không?


13

Tôi đang viết một tập lệnh liên quan đến việc tải xuống và thao tác với một tệp và tôi muốn đảm bảo rằng tệp đó không đầy đủ (do ví dụ như một kết nối bị mất) trước khi tôi làm việc với nó.

Câu trả lời:


10

Cách phổ biến nhất để xác minh tính toàn vẹn của các tệp đã tải xuống là sử dụng tổng kiểm MD5. Điều này giả định rằng trang web bạn đang tải xuống từ tổng kiểm MD5 thực sự được xuất bản của các tệp của họ. Bạn có thể xác minh tổng kiểm tra MD5 bằng cách tạo tổng kiểm tra của riêng bạn về tệp đã tải xuống và so sánh nó với tổng kiểm tra đã xuất bản. Nếu chúng giống hệt nhau, tập tin bạn đã tải xuống hoàn tất và không bị giả mạo.

Nếu bạn không mong đợi tệp bạn đang tải xuống thay đổi, bạn có thể tính toán tổng kiểm tra và mã cứng vào tập lệnh, nhưng nếu tệp được cập nhật, xác minh sẽ thất bại.

Để tạo tổng kiểm MD5 của một tệp chạy md5sum myFile. Trong trường hợp wget, bạn có thể thấy lệnh này hữu ích, đặc biệt nếu tệp bạn đang tải xuống lớn:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM.

Điều này sẽ tạo ra một tổng kiểm tra "myFile" trong khi tải xuống và lưu nó vào tệp MD5SUM, có thể giúp bạn tiết kiệm thời gian.

Trong trường hợp kết nối bị rớt, tôi nghĩ cách tốt nhất là kiểm tra mã thoát của wget. Nếu quá trình tải xuống thành công mà không có bất kỳ lỗi nào, wget sẽ quay trở lại 0. Bất cứ điều gì khác chỉ ra một cái gì đó đã đi sai. Hãy xem phần "Thoát trạng thái" của man wget.



7

Mã trả về của lệnh được sử dụng để tải xuống tệp sẽ cho bạn biết nếu lệnh được thực hiện thành công hay không. Thông thường, mã trả về 0 biểu thị thành công và bất kỳ số nào khác không biểu thị một lỗi. Bạn có thể truy cập mã trả về thông qua $?biến.

Một ví dụ cơ bản sử dụng wgetsẽ đi:

#!/bin/bash

wget foo.tgz &> /dev/null

if [[ "$?" != 0 ]]; then
    echo "Error downloading file"
else
    echo "Success"
fi

&> /dev/nullchuyển hướng tất cả đầu ra của wget để /dev/nulllý tưởng cho việc tạo kịch bản NHƯNG điều đó làm cho việc sửa wgetlỗi trở nên khó khăn hơn.


4
thay vào đó, bạn có thể làm:wget -q ... || { handle ; error ; }
mikeerv

@mikeerv Thậm chí không biết là đã ở đó, liên lạc tốt đẹp
Lạch

1
chỉ tìm thấy nó trong mankhi đọc qua để trả lời và hai điều tôi sẽ nói đã ở đây trong hai câu trả lời - vì vậy tôi đã thực hiện hai bình luận. Liên lạc tốt đẹp với bạn, quá.
mikeerv

Tôi hy vọng điều này sẽ không hoạt động khi được sử dụng với các proxy SOCKS như tor.
CodeInChaos

1
@Calet Điều tôi muốn nói là wgetcó thể nghĩ rằng quá trình tải xuống đã hoàn tất, ngay cả khi nó bị hỏng . Proxy thông tin về các kết nối TCP bị hỏng so với các kết nối TCP bị đóng có vấn đề với HTTP do nó sử dụng TCP đóng làm dấu kết thúc theo mặc định. Đó là lý do tại sao tôi đã thêm một kiểm tra nếu kích thước tệp từ tiêu đề phù hợp với kích thước tệp được tải xuống khi tôi chạy tải xuống hàng loạt. Không chắc chắn nếu wgetkiểm tra tính nhất quán như vậy hoặc thông số http nói gì về vấn đề này.
CodeInChaos
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.