Bagaimana cara membedakan beberapa file di seluruh direktori?


19

Saya mencoba menemukan diffdi antara semua file dengan nama yang sama di dua salinan direktori (misalnya yang berfungsi dan cadangan). Sebagai contoh, saya dapat diffdua file dengan nama yang sama di keduanya:

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

atau saya dapat menemukan perbedaan di direktori:

> diff d1 d2

tetapi bagaimana saya bisa menemukan perbedaan antara *.cppfile saja?

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

tampaknya tidak berfungsi (untuk alasan yang jelas).

[Mungkin mudah diselesaikan dengan loop, tapi saya mencoba menemukan cara yang lebih elegan]

Jawaban:


13

Anda dapat menggunakan shell loop yang menjalankan diff untuk setiap file, meskipun ini tidak akan menangkap kasus di mana d2 berisi file, tetapi d1 tidak. Mungkin cukup.

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

Atau semuanya dalam satu baris:

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

Bagian ${file##*/}tersebut merupakan ekspansi parameter khusus.

Jika variabel file berisi d1/hello.cpp, maka "${file##*/}"akan diperluas ke hello.cpp(nilai file, tetapi dengan semuanya hingga, dan termasuk, yang terakhir / dihapus).

Jadi "d2/${file##*/}"akan menghasilkan d2/hello.cppdan perintah diff yang dihasilkan adalah demikiandiff d1/hello.cpp d2/hello.cpp

Lihat http://mywiki.wooledge.org/BashFAQ/100 untuk lebih lanjut tentang manipulasi string di bash.

Di samping catatan, sistem kontrol versi (seperti subversi, git, lincah dll ...) akan membuat jenis diffing ini jauh lebih mudah.


Saya pikir dari dua jawaban yang bagus, ini lebih langsung jika ada beberapa jenis file (walaupun saya sebutkan dalam pertanyaan bahwa saya sedang mencari solusi no-loop), jadi saya menerimanya. Satu tambahan yang ditambahkan adalah echo "${file##*/}";sebelum diffperintah, jadi orang tahu file apa yang sebenarnya dibandingkan. Juga, seperti disebutkan dalam jawaban @ Rinzwind, metode ini tidak mencakup kasus ini jika daftar file tidak persis sama di kedua direktori.
ysap

52

diff -qr {DIR1} {DIR2} tidak semua file di kedua direktori.

  • q hanya menunjukkan perbedaan
  • rtidak rekursif. Biarkan saja jika Anda tidak membutuhkannya

Anda tidak dapat memberi tahu diffsecara langsung untuk menggunakan wildcard tetapi Anda dapat menambahkan:

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

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

untuk mengecualikan file. Jadi jika Anda hanya ingin *.cppmetode termudah adalah membuat file teks yang mencantumkan semua file yang tidak *.cpp. Anda dapat melakukan ini dengan perintah berikut: di ls -I "*.cpp" > excluded_filesmana -I "*.cpp"argumen mengabaikan semua file .cpp. Perhatikan bahwa tanda kutip diperlukan.


Sederhana, dan bekerja dengan sempurna.
Jose Gómez

4

Beberapa waktu setelah mengajukan pertanyaan, saya menemukan meldutilitas yang berbeda, dan saya menggunakannya sejak saat itu. Ini adalah bagian besar dari program berbasis GUI yang membuat perbandingan dan menggabungkan antara file dan direktori menjadi tugas yang sangat mudah. Itu membandingkan dua atau tiga arah.

Secara khusus, ini menjawab pertanyaan asli saya karena menunjukkan kepada Anda perbandingan kode warna dari isi direktori, dan memungkinkan Anda membandingkan file tertentu dengan mengklik dua kali pada nama file.

Jika seseorang membutuhkan lebih dari perbandingan tiga arah, maka gvimdiff(berdasarkan vimeditor) juga bagus yang menyediakan fungsi ini.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.