Yanıtlar:
Bunun için diff
komutu kullanabilirsiniz :
diff -bur folder1/ folder2/
Bu, birleşik bir bağlamla boşlukları yoksayan yinelemeli bir fark oluşturur:
-b
boşluk değişikliklerini yok sayar ve -u
3 satır tampon verir.
diff -rub folder1/ folder2/
-bur
soğuk bir iklimde yaşamış hatırlanması kolay olurdu.
Yalnızca farklı dosyaları görmek istiyorsanız, aşağıdakileri kullanabilirsiniz:
diff -qr dir_one dir_two | sort
"Q" seçeneği yalnızca farklı olan dosyaları gösterir ancak farklı içerik göstermez ve "sort" çıktıyı alfabetik olarak düzenler.
diff
farklı dosyaların her biri çift. Bir veya iki dosya farklıysa, düzinelerce dosya farklıysa, birinin yaklaşımı çok farklı olurdu. Bir diff
kerede düzinelerce dosyadan çıkışta kaybolabilirim !
-x PATTERN
belirli alt dizinleri hariç tutmak için komut içerebilir . Örneğin, diff -qr repo1 repo2 -x ".git"
iki dizini karşılaştırır (repo1 ve repo2), ancak ilgili dizinlerin .git klasöründeki dosyaları hariç tutar.
diff
yalnızca iki dosyayı karşılaştırmakla kalmaz, bu -r
seçeneği kullanarak, dizin dizinlerinin tamamını yürütebilir, alt dizinler ve her ağaçtaki karşılaştırılabilir noktalarda oluşan dosyalar arasındaki farkları tekrar tekrar kontrol edebilir.
$ man diff
...
-r --recursive
Recursively compare any subdirectories found.
...
GNU diff ise, iki dizine işaret edebilmeniz ve -r seçeneğini kullanabilmeniz gerekir.
Aksi takdirde, kullanmayı deneyin
for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done
Not Yorumlar bölümünde Dennis tarafından belirtildiği gibi, aslında ls üzerinde komut yerine koymanız gerekmez. Bunu uzun süredir yapıyorum ve otopilotta bunu yapıyorum ve karşılaştırma için dosya listemi almam gereken komutu değiştiriyorum.
Ben de GNU ls ls takma ls benim geçici olarak devre dışı bırakmak için '\ ls' yapmak için unuttum böylece GNU ls tarafından döndürülen listeden renk biçimlendirme bilgilerini kaybetmek.
ls
:for i in ./dir1/*
İşte iki klasördeki dosyalar arasındaki farkları gösteren bir komut dosyası. Özyineli olarak çalışır. Dir1 ve dir2'yi değiştirin.
(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/} $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )
Özellikle dosyaların içeriğini karşılaştırmak istemiyorsanız ve her iki dizinde de hangisinin bulunmadığını kontrol ediyorsanız, başka bir komut tarafından oluşturulan dosya listelerini karşılaştırabilirsiniz.
diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'
-printf '%P\n'
find
çıkış yollarına kök dizini önekinin eklenmemesini söyler .
Ayrıca sort
, dosyaların sırasının her iki çağrısında da aynı olmasını sağlamak için ekledim find
.
grep
Sonunda özdeş giriş hatları ilgili bilgileri kaldırır.
Bunu dene:
diff -rq /path/to/folder1 /path/to/folder2
diff
için GNU yardımcı programlarını indirerek komuta erişebilirsiniz .