Saya punya pertanyaan tentang perintah diff jika saya ingin diff direktori rekursif tetapi hanya untuk jenis file tertentu, bagaimana melakukannya?
Saya mencoba menggunakan opsi kecualikan tetapi hanya dapat menggunakan satu pola saja:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
dengan perintah saya hanya bisa mengecualikan jenis file xml, meskipun ada file dalam jenis folder gambar ( png
, gif
, jpg
), txt
, php
, dll
bagaimana membedakan jenis file tertentu saja.
Jawaban:
Anda dapat menentukan
-x
lebih dari satu kali.diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2
Dari bagian Membandingkan Direktori
info diff
(di sistem saya, saya harus melakukannyainfo -f /usr/share/info/diff.info.gz
):sumber
Diambil dari (versi) halaman manual:
-x PAT --exclude=PAT Exclude files that match PAT. -X FILE --exclude-from=FILE Exclude files that match any pattern in FILE.
Jadi sepertinya
-x
hanya menerima satu pola saat Anda melaporkan tetapi jika Anda meletakkan semua pola yang ingin Anda kecualikan dalam sebuah file (mungkin satu per baris), Anda dapat menggunakan tanda kedua seperti ini:di mana exclude.pats adalah:
sumber
find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
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-FILE
Saya ingin percaya itu membantu, mungkin di Linux juga. (Dalam contoh ini satu-name "*.[ch]"
tidak apa-apa, tetapi tidak terlalu menggambarkan)Anda juga dapat menggunakan find with -exec untuk memanggil diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
sumber
Kurangnya pelengkap --termasuk ....
Kami dapat melakukan satu solusi, file kecualikan dengan semua file tetapi yang ingin kami sertakan. Jadi kami membuat
file1
dengan menemukan semua file yang tidak memiliki ekstensi yang ingin kami sertakan,sed
menangkap nama file dan hanya:Sebagai contoh:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
sumber
find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
Saya menggunakan perintah berikut untuk menemukan diff dari semua
*.tmpl
file antaraDIR1
danDIR2
. Dalam kasus saya ini tidak menghasilkan positif palsu, tetapi mungkin untuk Anda, tergantung pada konten DIRS Anda.diff --brief DIR1 DIR2 | grep tmpl
sumber
Jika Anda ingin membedakan sumber dan membuatnya tetap sederhana:
diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"
Hapus grep terakhir jika Anda ingin mendapatkan file yang hanya ada di salah satu jalur.
sumber
grep "^Files"
menjadigrep "^Dateien"
Jika Anda merasa nyaman, Anda dapat menggunakan yang berikut ini
Makefile
. Jalankan saja: "buat tambalan"#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
sumber
Kurangnya komplementer --include membuatnya perlu untuk menggunakan pola heuristik yang berbelit-belit seperti
untuk menemukan (kebanyakan) file java!
sumber
Meskipun tidak menghindari
diff
file lain yang sebenarnya , jika tujuan Anda adalah menghasilkan file patch, atau yang serupa maka Anda dapat menggunakanfilterdiff
daripatchutils
paket, misalnya untuk hanya menambal.py
perubahan Anda :diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
sumber