Apakah ada cara saya dapat melakukan diff dua direktori secara rekursif tetapi hanya membandingkan (di tempat masing-masing) file yang cocok dengan nama file tertentu atau predikat tipe file?
Misalnya saya ingin melakukan sesuatu seperti
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... atau bahkan lebih baik:
diff -r dir-a dir-b -filetype text
Jelas itu tidak wajib untuk digunakan diff
karena saya kira mantera find
dan -exec diff
mungkin juga melakukan trik (saya hanya tidak tahu bagaimana menghasilkan filepath komplementer dalam kasus terakhir).
command-line
find
diff
Marcus Junius Brutus
sumber
sumber
Jawaban:
Shellscript
differ-r
Shellscript ini dapat melakukan diff dua direktori secara rekursif tetapi hanya membandingkan (di tempat masing-masing) file yang cocok dengan nama file atau pola tipe file tertentu.
Demo
File:
Pemakaian:
Berlari
differ-r
:Baris
diff
perintah yang dilakukan dicetak dengan teks hijau dan output, ketika tidak ada kecocokan yang dicetak dengan teks standar (putih di atas hitam pada tangkapan layar berikut).rsync
dengan filterJika Anda tidak perlu mendapatkan output yang menggambarkan perbedaan, hanya tahu file mana yang berbeda atau hilang (sehingga
rsync
ingin menyalinnya), Anda dapat menggunakan baris perintah berikut.Demo
Jika Anda ingin output bersih tanpa mengomentari baris dan tanpa direktori, Anda dapat
grep
output seperti itu,Shellscript
rsync-diff
One-liner ini dapat dibuat menjadi perintah inti dari sebuah shellscript
rsync-diff
.sumber
Karena Anda menyebutkan "Jelas tidak wajib menggunakan diff",
Ini harus melakukan pekerjaan untuk Anda berbaur mudah dikonfigurasi untuk jenis file apa yang diabaikan:
Selain itu alternatif lain adalah menulis skrip sederhana yang akan ditransfer dari daftar putih ke daftar hitam dan kemudian daftar hitam akan diteruskan ke diff dengan
--exclude
opsi.sumber
Dengan substitusi perintah pendukung shell, Anda dapat menggunakan satu-liner berikut (seperti yang sudah dicatat oleh @JammingThebBits):
Ini bekerja seperti ini:
find
mencari file yang tidak menarik,sed
mengekstrak nama dasarnya (berjalanbasename
sangat lambat jika Anda memiliki banyak file) dan menempatkannya dalam file sementara ; file seperti itu kemudian diteruskan kediff
menyuruhnya untuk mengecualikan mereka dari perbandingan (double exclusion = inclusion).Jika Anda tidak memiliki substitusi perintah, letakkan
sed
output dalam file dan berikan secara eksplisitdiff
.Dalam contoh saya hanya mencari file XML dan JAVA, ubah sesuai kebutuhan dengan memisahkannya dengan OR.
sumber