İki farklı dizinde bulunan diff dosyaları


303

Aynı dosya listesine sahip iki dizinim var. diffKomut kullanarak her iki dizinde bulunan tüm dosyaları karşılaştırmak gerekiyor . Bunu yapmak için basit bir komut satırı seçeneği var mı, yoksa dosya listesini almak ve sonra yineleme için bir kabuk komut dosyası yazmak zorunda mıyım?

Yanıtlar:


422

Bunun için diffkomutu kullanabilirsiniz :

diff -bur folder1/ folder2/

Bu, birleşik bir bağlamla boşlukları yoksayan yinelemeli bir fark oluşturur:

  • b bayrağı boşlukları görmezden gelmek anlamına gelir
  • u bayrağı birleştirilmiş bağlam anlamına gelir (3 satır öncesi ve sonrası)
  • r bayrağı özyinelemeli anlamına gelir

9
Win32diff için GNU yardımcı programlarını indirerek komuta erişebilirsiniz .
Laurent Etiemble

7
Ben de - kısa seçenek yararlı olduğunu bulduk; değiştirilen dosyaların bir listesini alırsınız ve ayrı olarak işleyebilirsiniz
Dariusz

27
Merak eden başkaları için, -bboşluk değişikliklerini yok sayar ve -u3 satır tampon verir.
rattray

28
Bur ie yerine rub kullanırsanız bu komutu hatırlamak daha kolaydiff -rub folder1/ folder2/
SomeGuyOnAComputer

11
Hayal ediyorum -bursoğuk bir iklimde yaşamış hatırlanması kolay olurdu.
AlanH

126

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.


1
Bu harika! Ayrıca verimli bir şekilde çalışır - yani tüm bir alt dizin sadece dirslerden birinde mevcutsa, onun içinde yinelenen durur ve yalnızca alt dizinin kendisini bildirir (ardıl içeriği olmadan). çok hoş!!
SomethingSomething

Eğer bir şey, ne bakınız: Bu gerçekten iyi bir ilk adımdır gelmez farklılık ve sonra bir ayrıntılı yapmak difffarklı dosyaların her biri çift. Bir veya iki dosya farklıysa, düzinelerce dosya farklıysa, birinin yaklaşımı çok farklı olurdu. Bir diffkerede düzinelerce dosyadan çıkışta kaybolabilirim !
jvriesem

Ayrıca, -x PATTERNbelirli 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.
ViFI

20

Diff'in -rbunu yapmak için bir seçeneği var.

diff -r dir1 dir2


11

diffyalnızca iki dosyayı karşılaştırmakla kalmaz, bu -rseç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.

...

3

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.


2
Kullanmak gerekli değildir ls:for i in ./dir1/*
sonraki duyuruya kadar duraklatıldı.

1
@Dennis, korkak kısayol. +1. Otomatik olsa komut değiştirme yapmaya çok alışkınım ve ihtiyacım olan komutu kullanıyorum, örneğin bazen find kullanıyorum. Ls kullanmak da dir listesiyle daha fazla oynamama izin veriyor, örneğin, varsayılan sıra yerine ters zamana dayalı.
Rob Wells

0

İş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" )

0

Ö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.

grepSonunda özdeş giriş hatları ilgili bilgileri kaldırır.


-4

Bunu dene:

diff -rq /path/to/folder1 /path/to/folder2      

2
Bu, mevcut bir yanıtı çoğaltır ve yeni içerik eklemez. Katkıda bulunacak yeni bir şeyiniz yoksa lütfen yanıt göndermeyin.
Toby Speight
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.