Birden çok dosyayı dizinlere nasıl dağıtırım?


19

Ben diffbir dizinin iki kopyası (çalışan ve yedek demek) aynı adların tüm dosyaları arasında bulmaya çalışıyorum . Örneğin, diffher ikisinde de aynı ada sahip iki dosya yapabilirim :

> diff d1/f.cpp d2/f.cpp

veya dizinler arasında farklılıklar bulabilirim:

> diff d1 d2

ancak *.cppyalnızca dosyalar arasındaki farkları nasıl bulabilirim ?

> diff d1/*.cpp d2/*.cpp

çalışmıyor gibi görünüyor (bariz nedenlerle).

[Döngülerle çözmek muhtemelen kolaydır, ancak daha zarif bir yol bulmaya çalışıyorum]

Yanıtlar:


13

Her dosya için diff çalıştıran bir kabuk döngüsü kullanabilirsiniz, ancak bu d2'nin bir dosya içerdiği durumları yakalamaz, ancak d1 içermez. Yine de yeterli olabilir.

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

Veya hepsi bir satırda:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

${file##*/}Bölüm özel parametre açılımıdır.

Dosya değişkeni içeriyorsa d1/hello.cpp, o "${file##*/}"zaman genişler hello.cpp(dosyanın değeri, ancak son / kaldırılana kadar ve dahil olmak üzere).

Böylece "d2/${file##*/}"sonuçlanacak d2/hello.cppve sonuçta ortaya çıkan diff komutudiff d1/hello.cpp d2/hello.cpp

Bash'deki dize manipülasyonları hakkında daha fazla bilgi için http://mywiki.wooledge.org/BashFAQ/100 adresine bakın.

Bir yan notta, bir sürüm kontrol sistemi (subversion, git, mercurial vb ...) bu tür farklılıkları çok daha kolay hale getirecektir.


Ben iki büyük cevaplar, birden fazla dosya türü olduğunda bu daha açık olduğunu düşünüyorum (her ne kadar ben bir döngüsüz çözüm arıyorum sorusunda bahsetmiştim), bu yüzden kabul ettim. Eklenen bir ek komuttan echo "${file##*/}";önce gelir diff, bu yüzden gerçekten hangi dosyaların karşılaştırıldığını bilir. Ayrıca, @ Rinzwind'in cevabında belirtildiği gibi, dosya listesi her iki dizinde de tam olarak aynı olmadığı için bu yöntem durumu kapsamaz.
ysap

52

diff -qr {DIR1} {DIR2} her iki dizindeki tüm dosyaları yapar.

  • q sadece farkları gösterir
  • rözyinelemeli. İhtiyacınız yoksa dışarıda bırakın

diffDoğrudan joker karakter kullanmasını söyleyemezsiniz, ancak şunları ekleyebilirsiniz:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

dosyaları hariç tutmak için. Yani sadece *.cppen kolay yöntem istiyorsanız olmayan tüm dosyaları listeleyen bir metin dosyası oluşturmaktır *.cpp. Bunu aşağıdaki komutla yapabilirsiniz: ls -I "*.cpp" > excluded_filesburada -I "*.cpp"bağımsız değişken tüm .cpp dosyalarını yok sayar. Tırnak işaretlerinin gerekli olduğunu unutmayın.


Basit ve kusursuz çalışır.
Jose Gómez

4

Soruyu sorduktan bir süre sonra, melddiff yardımcı programını öğrendim ve o zamandan beri kullanıyorum. Bu dosyalar ve dizin arasında karşılaştırma ve birleştirme çok kolay bir görev yapar GUI tabanlı bir programın harika bir parçasıdır. İki veya üç yollu karşılaştırma yapar.

Özellikle, orijinal içeriğimi, dizin içeriğinin renk kodlu bir karşılaştırmasını göstermesi ve dosya adını çift tıklatarak belirli dosyaları karşılaştırmanıza izin vermesi nedeniyle yanıtlar.

Üç yollu bir karşılaştırmadan daha fazlasına ihtiyaç duyulursa, gvimdiff( vimeditöre bağlı olarak) bu işlevi de sağlayan harika bir özelliktir.


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.