İndirilen bir dosyanın eksiksiz veya bozuk olup olmadığını kontrol edebileceğim bir komut satırı yöntemi var mı?


13

Bir dosyayı indirmeyi ve değiştirmeyi içeren bir komut dosyası yazıyorum ve üzerinde çalışmadan önce dosyanın eksik olmadığından (örneğin, kesilen bir bağlantı nedeniyle) emin olmak istiyorum.

Yanıtlar:


10

İndirilen dosyaların bütünlüğünü doğrulamanın en yaygın yolu MD5 sağlama toplamlarını kullanmaktır. Bu, indirdiğiniz sitenin dosyalarının gerçekten yayınlanmış MD5 sağlama toplamlarını aldığını varsayar. İndirilen dosyanın kendi sağlama toplamını oluşturarak ve yayınlanan sağlama toplamıyla karşılaştırarak bir MD5 sağlama toplamını doğrulayabilirsiniz. Bunlar aynıysa, indirdiğiniz dosya tamamlanır ve değiştirilmez.

İndirdiğiniz dosyanın değişmesini beklemiyorsanız, bir sağlama toplamı ve sabit kodunu komut dosyasına önceden kodlayabilirsiniz, ancak dosya güncellenirse doğrulama başarısız olur.

Bir dosyayı çalıştırmak için MD5 sağlama toplamı oluşturmak için md5sum myFile. Wget durumunda, özellikle indirdiğiniz dosya büyükse bu komutu yararlı bulabilirsiniz:

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

Bu, indirirken "myFile" adlı bir sağlama toplamı oluşturur ve MD5SUM dosyasına kaydederek muhtemelen size zaman kazandırır.

Bağlantı kesilmesi durumunda, en iyi yolun wget'in çıkış kodlarını kontrol etmek olduğunu düşünüyorum. İndirme işlemi herhangi bir hata olmadan başarılı olursa, wget geri dönecektir 0. Başka bir şey bir şeyin yanlış gittiğini gösterir. Sayfasının "Çıkış durumu" bölümüne bakın man wget.



7

Dosyayı indirmek için kullanılan komutun dönüş kodu, komutun başarıyla yürütülüp yürütülmediğini size bildirir. Tipik olarak, 0 döndürme kodu başarıyı ve sıfır olmayan herhangi bir sayı bir hatayı belirtir. Dönüş koduna $?değişken üzerinden erişebilirsiniz .

Kullanarak temel bir örnek wget:

#!/bin/bash

wget foo.tgz &> /dev/null

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

&> /dev/nulltüm wget çıktılarını yönlendirir, /dev/nullbu yüzden komut dosyası oluşturmak için idealdir AMA hata ayıklama wgethatalarını zorlaştırır.


4
bunun yerine şunları yapabilirsiniz:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv Orada olduğunu bile bilmiyordum, hoş bir dokunuş
Creek

1
sadece mancevaplamak için okurken buldum ve söyleyeceğim iki şey zaten iki cevapta - bu yüzden iki yorum yaptım. Sana da hoş bir dokunuş.
mikeserv

Tor gibi SOCKS proxy'leriyle kullanıldığında bunun çalışmamasını bekliyorum.
CodesInChaos

1
@Creek Demek istediğim, wgetkırılmış olsa bile indirme işleminin tamamlandığını düşünebilir. Varsayılan olarak kapalı TCP olarak kapalı TCP kullandığı için bozuk TCP bağlantıları ve kapalı TCP bağlantıları hakkında HTTP ile ilgili sorunlu proxy'ler. Bu yüzden, toplu indirmeyi çalıştırdığımda, başlıktaki dosya boyutunun indirilen dosya boyutuyla eşleşip eşleşmediğini kontrol ettim. Bu wgettür tutarlılık olup olmadığını veya http spec'in bu konuda ne söylediğini emin değilim .
CodesInChaos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.