Bir dizini yalnızca belirli bir türdeki dosyalar için nasıl ayırt edersiniz?


88

Yinelemeli bir dizin diff istiyorsam ancak yalnızca belirli bir dosya türü için diff komutuyla ilgili bir sorum var, bunu nasıl yapabilirim?

Hariç tutma seçeneğini kullanmayı denedim, ancak yalnızca bir model kullanabiliyorum:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml

Ben sadece xml dosya türünü hariç tutabilir komutla rağmen (klasör resim türünde dosya vardır png, gif, jpg), txt, php, vb

sadece belirli dosya türlerinin nasıl ayırt edileceği.



Öyleyse, belirli türdeki dosyaları ayırt etmeye mi yoksa bu dosyaları farklılıktan muaf tutmaya mı çalışıyorsunuz? Soru, açıklamayla bağlantılı değil ..
def

Yanıtlar:


98

-xBirden fazla belirtebilirsiniz .

diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2

Dizinleri Karşılaştırma bölümünden info diff(sistemimde yapmam gerekiyor info -f /usr/share/info/diff.info.gz):

Dizinleri karşılaştırırken bazı dosyaları yok saymak için '-x PATTERN' veya '--exclude = PATTERN' seçeneğini kullanın. Bu seçenek, temel adları PATTERN kabuk modeliyle eşleşen tüm dosyaları veya alt dizini yok sayar. Kabuktan farklı olarak, bir dosya adının başlangıcındaki bir nokta, bir modelin başlangıcındaki bir joker karakterle eşleşir. Kabuğun genişletmemesi için PATTERN'i tırnak içine almalısınız. Örneğin, -x '*. [Ao]' seçeneği , adı '.a' veya '.o' ile biten dosyaları yok sayar.

Bu seçenek, birden çok kez belirtirseniz birikir. Örneğin, -x 'RCS' -x '* seçeneklerini kullanmak, temel adı' RCS 'olan veya', v 'ile biten tüm dosya veya alt dizini yok sayar.


Mine (ubuntu 10.04) bu satırlara sahip değil. Ben de denedim ve işe yaramadı. Sanırım bu yeni bir versiyon.
alumi

22

Man sayfasından (versiyonundan) alınmıştır:

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

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

Bu nedenle, -xrapor ettiğinizde yalnızca bir kalıbı kabul ediyor gibi görünüyor, ancak hariç tutmak istediğiniz tüm kalıpları bir dosyaya koyarsanız (muhtemelen satır başına bir tane) ikinci bayrağı şu şekilde kullanabilirsiniz:

$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats

exclude.pats ise:

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif

4
Aşağıdaki komut satırına sahip <my-ext> uzantısı dışındaki tüm dosya uzantılarını klasörünüzde bulabilirsiniz:find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
John

Keşke John'un yorumunu daha önce fark etmiş olsaydım, ancak macOs / bash'da, saklanacak çeşitli kalıplarla dışlama dosyasını üretmek için benzer bir çözüme geldim: find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILEBunun yardımcı olduğuna inanmak istiyorum, belki Linux'ta da. (Bu örnekte bir single -name "*.[ch]"tamamdır, ancak çok açıklayıcı değildir)
eruve

16

Ayrıca diff'i çağırmak için -exec ile bul komutunu kullanabilirsiniz:

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

7

Tamamlayıcı bir --içerir ...

Tek bir geçici çözüm yapabiliriz, tüm dosyaları içeren bir dışlama dosyası, ancak istediğimiz şeyi dahil edebiliriz. Bu yüzden file1, dahil etmek istediğimiz uzantılara sahip olmayan tüm dosyaları bul ile oluşturuyoruz , dosya adını sedyakalıyoruz ve sadece:

diff --exclude-from=file1  PATH1/ PATH2/

Örneğin:

find  PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 
diff PATH1/ PATH2/ -rq -X file1 

Süper kullanışlı tek astarlı, teşekkürler. Mac OSX'te grep biraz farklıdır ve şu hale gelir find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
mmacvicar

3

Ben her diff bulmak için aşağıdaki komutu kullanılır *.tmplarasındaki dosyaları DIR1ve DIR2. Benim durumumda bu herhangi bir yanlış pozitif sonuç vermedi, ancak DIRS'nizin içeriğine bağlı olarak sizin için olabilir.

diff --brief DIR1 DIR2 | grep tmpl


2

Kaynakları farklılaştırmak ve basit tutmak istiyorsanız:

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

Yollardan yalnızca birinde bulunan dosyaları almak istiyorsanız son grep'i kaldırın.


Ben gibi basitlik :-) alman değişikliklerinde grep "^Files"içingrep "^Dateien"
Erich KUESTER

2

Uygun bulmanız durumunda, aşağıdakileri kullanabilirsiniz Makefile. Sadece çalıştırın: "yama oluştur"

#Makefile for patches

#Exlude following file endings
SUFFIX += o
SUFFIX += so
SUFFIX += exe
SUFFIX += pdf
SUFFIX += swp

#Exlude following folders
FOLDER += bin
FOLDER += lib
FOLDER += Image
FOLDER += models

OPTIONS = Naur

patch: 
    rm test.patch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
        org/ new/ > test.patch  

unpatch: 
    rm test.unpatch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
    new/ org/ > test.unpatch

1

Tamamlayıcı bir --include olmaması, aşağıdaki gibi karmaşık sezgisel kalıpların kullanılmasını gerekli kılar:

*.[A-Zb-ik-uw-z]*

(çoğunlukla) java dosyalarını bulmak için!


0

diffDiğer dosyaların gerçeklerinden kaçınmasa da , amacınız bir yama dosyası veya benzeri bir şey oluşturmaksa filterdiff, patchutilspaketten kullanabilirsiniz , örneğin yalnızca .pydeğişikliklerinizi yamamak için :

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
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.