Bir dosyanın bozuk olup olmadığını nasıl kontrol edebilirim?


13

Bir dosyanın bozuk olup olmadığını kontrol etmek için genel çözümler var mı? Örneğin, bir video dosyasının bozuk veya sıkıştırılmış bir dosyanın bozuk olup olmadığı vb.


1
Diskte fiziksel bir hata olup olmadığını veya dosyadaki bilgilerin yanlış olup olmadığını mı soruyorsunuz?
Thorbjørn Ravn Andersen

2
Rasgele bir dosyadaki bilgilerin doğru olup olmadığını kontrol etmek oldukça zordur. echo "P = NP" >is-this-corrupt.txt:)
Tom Anderson

Yanıtlar:


10

Hayır, genel bir çözüm yok. Bir dosyanın bozuk olup olmadığını kontrol etmenin tek yolu denemek ve okumaktır; sadece o formatın nasıl okunacağını bilen yazılım bunu yapabilir.

Yapabileceğiniz şey file, dosyanın türünü tanımlamak için kullanın ve daha sonra dosyayı kontrol etmek için uygun bir program seçmek için türü kullanın. Bunun gibi bir senaryo yazabilirsiniz:

# /bin/bash -eu

FILENAME=$1

FILETYPE="$(file -b $FILENAME | head -1 | cut -d , -f 1)"
case "$FILETYPE" in
    "gzip compressed data") CHECKER="gunzip -t" ;;
    # many, many more lines here
    *) echo "Unknown type: $FILETYPE"; exit 1 ;;
esac

$CHECKER $FILENAME

Ancak vaka bildirimini doldurmak için yapmanız gereken çok iş var.

Birisi zaten böyle bir komut dosyası (veya program) yazmış olabilir, ama ben bilmiyorum.


1
"sadece o formatın nasıl okunacağını bilen yazılım bunu yapabilir" yanlış bir varsayımdır. Onlara verdiğiniz dosya türünü umursamayan birçok program var. (Örneğin düşünün grep, cat, tar...). Bu nedenle çözümünüz çok şişirilmiş.
rozcietrzewiacz

4
"Oku" derken, "yorumlamak" demek istedim. catYolsuzluğu kontrol etmek için veya bir dosyayı yalnızca yapılandırılmamış bayt akışı olarak işleyen başka bir programı kullanamazsınız . Çözümümün şiştiğine inanmıyorum.
Tom Anderson

Caleb'in önerdiği gibi, her dosyayı ikili veri olarak ele alabilir ve daha sonra doğrulamak için sağlama toplamlarını depolayabilirsiniz. Bu evrensel, basit ve nispeten hızlı.
rozcietrzewiacz

1
Ancak şimdi yaklaşımınızın, daha önce görmediğiniz veya erişmediğiniz dosyalarda bile doğrulamayı yapabileceğiniz bir yararı olduğunu görüyorum. Bu kesinlikle bir artı - cevabınızda işaret edebilirsiniz.
rozcietrzewiacz

14

Dosyanın iyi olduğunu bir zamanda biliyorsanız, bir sağlama toplamı oluşturabilir ve daha sonra karşılaştırmak için hala tam olduğundan emin olmak için kullanabilirsiniz. Bu, dosyaları ortamlar arasında veya ağlar arasında aktarmadan önce kullanışlıdır.

Bir dosyanın iyi durumunu bilmiyorsanız, hiçbir evrensel yol veya yolsuzluk kontrolü yoktur. Her durumda yalnızca belirli dosya biçimi neyin bozuk veya neyin bozuk olmadığını belirler.


3

ZFS'yi kullanırsanız, dosyayı okuyabilirsiniz ve bozulmadığı veya okuma hatası aldığınız garanti edilir.

Düzenle Akıllıca yorumlardan sonra, cevabımın açıklaması:

ZFS, sessiz veri bozulmasına karşı koruma ve algılama yapabilir. örneğin: http://www.zdnet.com/blog/storage/data-corruption-is-worse-than-you-know/191 Tabii ki dosya ilk yazıldığı anda zaten bozulmuşsa, hiçbir şey yoktur dosya sistemi yapabilir.

Dosyanın iletimi sırasında oluşabilecek yolsuzluklara karşı korunmak için, genel amaçlı teknikler md5sum veya benzeri karmalardır.


vay, ne bir özellik: O
LanceBaynes

1
Web'den bozuk bir video indirirseniz? ZFS orada size yardımcı olmak için hiçbir şey yapmaz - sadece bozuk dosyanın değişmediğini doğrular. ZFS harika, ancak bozuk dosyaları kontrol etmek için bir çözüm değil.
Tom Anderson

Ne yazık ki bu sadece bir dosya sistemi bütünlük denetimi, dosyaların gerçek bir anlayış ve bozuk olup olmadığını değil. @Lance'dan sonra geldiğinden şüphelendiğim en yaygın kullanım, indirilen veya başka bir şekilde aktarılan gelen bir dosyanın geçerli olup olmadığına karar verebilmektir. ZFS, bir dosyanın iyi olup olmadığına sihirli bir şekilde karar veremez, yalnızca verdiğiniz her şeyin yerel olarak tek parça halinde kaydedileceğini ve geri verileceğini vaat eder.
Caleb

Soru / veri kurtarma ve / dosya sistemleri olarak etiketlendiğinden, ilk başta zaten kırılmış dosyalar hakkında değil, sessiz veri bozulması ile ilgili olduğunu varsaydım. Cevap bu noktayı açıklığa kavuşturmak için düzenlendi.
jlliagre

@jiliagre: Bu soruyu, cevabınızdan yaklaşık bir saat sonra o etiketle (muhtemelen yanlış) yeniden ifade ettim. Cevap verdiğinizde sadece "linux" olarak etiketlendi.
Caleb
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.