Unix/Linux'ta iki dosyanın aynı olup olmadığını anlamanın en hızlı yolu nedir?

İ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?

Çözüm

cmp`nin ilk bayt farklılığında duracağına inanıyorum:

cmp --silent $old $new || echo "files are different"
Yorumlar (10)

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
Yorumlar (23)

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.

Yorumlar (1)