İki dosyanın aynı olup olmadığını kontrol etmem gereken bir kabuk betiğim var. Bunu çok sayıda dosya için yapıyorum ve betiğimde diff
komutu performans darboğazı gibi görünüyor.
İşte çizgi:
diff -q $dst $new > /dev/null
if ($status) then ...
Dosyaları karşılaştırmanın daha hızlı bir yolu olabilir mi, belki varsayılan diff
yerine özel bir algoritma?
Neden her iki dosyanın içeriğinin karmasını almıyorsunuz?
Bu betiği deneyin, örneğin script.sh olarak adlandırın ve ardından aşağıdaki gibi çalıştırın: script.sh file1.txt file2.txt
#!/bin/bash
file1=`md5 $1`
file2=`md5 $2`
if [ "$file1" = "$file2" ]
then
echo "Files have the same content"
else
echo "Files have NOT the same content"
fi
Farklı olmayan dosyalar için, herhangi bir yöntem, okuma geçmişte yapılmış olsa bile, her iki dosyanın da tamamen okunmasını gerektirecektir.
Başka bir alternatif yoktur. Dolayısıyla, bir noktada hash veya sağlama toplamı oluşturmak tüm dosyanın okunmasını gerektirir. Büyük dosyalar zaman alır.
Dosya meta verilerinin alınması, büyük bir dosyanın okunmasından çok daha hızlıdır.
Peki, dosyaların farklı olduğunu belirlemek için kullanabileceğiniz herhangi bir dosya meta verisi var mı? Dosya boyutu ya da dosyanın sadece küçük bir kısmını okuyan file komutunun sonuçları?
Dosya boyutu örnek kod parçası:
ls -l $1 $2 |
awk 'NR==1{a=$5} NR==2{b=$5}
END{val=(a==b)?0 :1; exit( val) }'
[ $? -eq 0 ] && echo 'same' || echo 'different'
Dosyalar aynı boyuttaysa, tam dosya okumalarına takılıp kalırsınız.