Temelde takip eden baytı koşulsuz olarak göz ardı ederek iki dosyayı karşılaştırmanız gerekir. Bunu yapmak için bir 'diff' seçeneği yoktur - ancak yapılabilecek bir takım yollar vardır (örneğin, hex diff aynı zamanda akla gelir.)
'Diff' kullanmak için, temel olarak dosyanın sonunda yeni satırı eksik olan dosyaları değiştirmeniz ve sonra karşılaştırmanız gerekir. Değiştirilen dosyalarla geçici bir dizin oluşturabilir veya bellekte yapılabilecek bir miktar kod yazarak. (Tercih edildiği şekli tercihinize, dosya boyutuna, dosya sayısına bağlıdır ...)
Örneğin, aşağıdakiler bir dosyanın içeriğini ( sed -i
yerinde değiştirmek için kullanın , bu sadece stdout'a yazdırır), eğer bir tane eksikse yeni bir satır eklemek için değiştirir (veya zaten bir satırsonu varsa dosyayı değiştirmez):
sed -e '$a\' file1.txt
Ve sadece 'diff' sözdizimini gözden geçirmek için (doğru döndürmek, aynı anlamına gelir, yanlış araçlar farklıdır):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Yalnızca boşlukların farklı olduğunu doğrulayın:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
Bash'da, dosya içeriğini 'diff' e iletilirken (orjinal dosyalar değişmeden kaldı) değiştirmek için 'sed' kullanabiliriz:
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Artık tek yapmanız gereken, diff -r
dizinleri yinelemeli olarak karşılaştırmak için öykünmek . Eğer dizinleri karşılaştırmak a
ve b
tüm dosyalar için daha sonra a
(örneğin, a/dir1/dir2/file.txt
dosyaya) derived yolu b
(örneğin b/dir1/dir2/file.txt
) ve karşılaştır:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Biraz daha ayrıntılı bir sürüm:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same
sed -e '$a\'
tam olarak ne yaptığını açıklayabilir misiniz ? thx