'Diff -X'i dosya yollarını değil, belirli yolları yoksaymayı nasıl sağlayabilirim?


29

Yapma: diff -r -X <ignore-list> <src-dir> <dest-dir>

yapmak görünmüyor diffgirişleri görmezden <ignore-list>onlar formun ise <dir>/<file>.

<fileAncak formun girdileri dikkate alınmaz. Bu bir sorundur çünkü <file>farklı alt dizinlerde adlandırılmış birden fazla dosyaya sahip olabilirim , bunlardan bazıları göz ardı edilmesini istemiyorum.

Her diffiki sayfada da kalıp sözdizimi ile ilgili fazla bilgi bulunmuyor . Söyleyebileceğim kadarıyla, sadece diff tarafından kabul edilen bir dosyanın temel adıdır ( ilgileniyorsanız http://forums.gentoo.org/viewtopic-t-889788-start-0.html sayfasına bakın ).


erkek, diff'in --excludeseçenek ... boktan böyledir
Elouan Keryell-Hatta

Yanıtlar:


30

Liste dizinleri çalışmalıdır; örneğin, bir komut dosyasında kullandığım şey (gnu diff olduğu varsayılarak),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... içeriğini .svnve .gitdir'leri değil, aynı zamanda *.zip/ *.gz/ etc adındaki dosyaları da yok sayar .

Düzenleme: Formun yollarını filtrelemek için, dir_a/file1ancak yine diffde aynı temel adı olan dosyaları dir_b/file1veya dir_a/b/file1daha sonra, sonradan oluşturulacak dosyaların bir listesini diff(örneğin, kullanarak find) ve bu yollardan türetilmiş olan karşılaştırmayı yapması gereken dosya listesi; örneğin, verilen

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

Örneğin, hariç tutulacak */a/2.txtancak yine de adlandırılmış diğer dosyaları karşılaştırarak karşılaştırılacak dosyaların listesini oluşturursunuz 2.txt. Sadece hariç tüm dosyaları "bulmak" ONE/a/2.txt(örneğin bir regexp de kullanılabilir .*/a/2.txt)

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

hangi aslında yok sayar ONE/a/2.txt(ve TWO/a/2.txt), ama yine de adlandırılmış diğer dosyaları karşılaştırır 2.txt:

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

Düzenleme: Veya, findokuyucunun alıştırması olarak bırakılan ek eğlence ile daha eğlenceli, hariç tutulacak dosyaları veya dizinleri ve ardından diğer diffher şeyi seçin:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

Yukarıdaki örnekte, "{top} /a/2.txt" dosyası, "b" adındaki herhangi bir dizin hariç tutulur ve diğer her şey farklıdır. (Basit " -name b" yerine " " de kullanabilirsiniz -regex '.*/b'- not, iz yok "/".)


2
Teşekkürler ama bence noktayı kaçırıyorsun. Orada görünen tek destek bir 'temel isim' kullandığınız zamandır. Bir dizinin veya dosyanın adı olabilir. Her iki durumda da diff ne istediğini yoksayar. Yolları kullandığınızda sorun ortaya çıkar. Örneğin, / an / mutlak / yol / to / a / dosya ya da ./a/relative/path/to/a/file dosyasını görmezden gelmekte zorlanıyorum.
Ash,

2
diff --exclude = "/ bu / özel / dosya / that / im / açıkça / yalvarma / siz / için / yoksayın". İşe yaramaz.
Ash,

3
doğru, excludedesenler dosyaların adlarına göre eşleştirilir ( gnu.org/software/diffutils/manual/html_node/… uyarınca ); yollar çalışmaz (olduğu gibi foo/bar.txt). Bunu yapmak için, finddosya adlarının listesini oluşturmak için koşmanız ve karşılaştırılacak dosyanın yolunu türetmeniz gerekir.
michael,

dosya yollarını hariç tutarak örnek eklemek için güncellenmiş yanıt diff, sadece kullanmak yerinebasename
michael 14:13

Tamam, ne önerdiğini anlıyorum ama bir sorun var gibi gözüküyor. Sadece dosyaları değil, dizinleri de göz önünde bulundurmam gerekiyor (yani -type f). Şimdi, regexp kullanarak bazı dosyaları hala budanarak eritebilirseniz find, eğer girdi diffbir dizin içeriyorsa, o dizin içerisindeki dosyaları inceleyecek ve karşılaştıracaktır ve bu dosyaların bazılarının göz ardı edilmesi gerekebilir .... kare 1'e dön.
Ash


1

Dizini dışlamak için directory/sub-directorykullanıyorum

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Bununla birlikte, tek bir dışlama için çalışması gerekirse de, sahip olduğunuz kadar uzun bir yoksayma listesi için mümkün olmamalıdır.


-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

1
Bu soruyu cevaplayabilse de, neden böyle olduğunu açıklayabilirseniz daha iyi bir cevap olabilir .
DavidPostill
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.