Apakah ada metode baris perintah yang dapat saya gunakan untuk memeriksa apakah file yang diunduh sudah lengkap atau rusak?

13

Saya sedang menulis skrip yang melibatkan mengunduh dan memanipulasi file, dan saya ingin memastikan bahwa file tersebut tidak lengkap (karena misalnya koneksi terputus) sebelum saya mengerjakannya.

Clare
sumber

Jawaban:

10

Cara paling umum untuk memverifikasi integritas file yang diunduh adalah dengan menggunakan checksum MD5. Ini mengasumsikan bahwa situs yang Anda unduh dari checksum MD5 yang sebenarnya diterbitkan dari file mereka. Anda dapat memverifikasi MD5 checksum dengan membuat sendiri checksum dari file yang diunduh dan membandingkannya dengan checksum yang diterbitkan. Jika mereka identik, file yang Anda unduh sudah selesai dan tidak dirusak.

Jika Anda tidak mengharapkan file yang sedang Anda unduh berubah, Anda dapat melakukan precum pada checksum dan memasukkannya ke dalam skrip, tetapi jika file diperbarui, verifikasi akan gagal.

Untuk membuat checksum MD5 dari suatu file yang dijalankan md5sum myFile. Dalam kasus wget Anda mungkin menganggap perintah ini bermanfaat, terutama jika file yang Anda unduh berukuran besar:

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

Ini akan membuat checksum "myFile" saat mengunduh dan menyimpannya ke file MD5SUM, mungkin menghemat waktu Anda.

Dalam kasus koneksi terputus saya pikir cara terbaik adalah dengan memeriksa kode keluar dari wget. Jika unduhan berhasil tanpa kesalahan, wget akan kembali 0. Ada lagi yang menunjukkan ada kesalahan. Lihatlah bagian "Status Keluar" dari man wget.

arnefm
sumber
7

Kode kembali dari perintah yang digunakan untuk mengunduh file akan memberi tahu Anda apakah perintah tersebut berhasil atau tidak. Biasanya, kode pengembalian 0 menunjukkan keberhasilan dan angka bukan nol menunjukkan kesalahan. Anda dapat mengakses kode kembali melalui $?variabel.

Contoh dasar menggunakan wgetakan muncul:

#!/bin/bash

wget foo.tgz &> /dev/null

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

&> /dev/nullmengarahkan ulang semua output wget ke /dev/nullsehingga ideal untuk scripting TAPI itu membuat wgetkesalahan debug lebih sulit.

Sungai kecil
sumber
4
Anda dapat melakukannya sebagai gantinya:wget -q ... || { handle ; error ; }
mikeserv
@ mikeserv Bahkan tidak tahu itu ada di sana, sentuhan yang bagus
Creek
1
hanya menemukannya manketika membaca untuk menjawab dan dua hal yang akan saya katakan sudah ada di sini dalam dua jawaban - jadi saya melakukan dua komentar. Sentuhan yang bagus untukmu juga.
mikeserv
Saya berharap ini tidak berfungsi ketika digunakan dengan proksi SOCKS seperti tor.
CodesInChaos
1
@Creek Yang saya maksud adalah yang wgetmungkin berpikir unduhan itu selesai, bahkan jika itu rusak. Proksi informasi tentang koneksi TCP terputus vs. koneksi TCP tertutup yang bermasalah dengan HTTP karena menggunakan TCP tertutup sebagai tanda akhir secara default. Itu sebabnya saya menambahkan tanda centang apakah ukuran file dari header cocok dengan ukuran file yang diunduh ketika saya menjalankan unduhan massal. Tidak yakin apakah wgetkonsistensi seperti itu memeriksa atau apa yang dikatakan spek http tentang masalah ini.
CodesInChaos