File Diff hadir dalam dua direktori berbeda


303

Saya memiliki dua direktori dengan daftar file yang sama. Saya perlu membandingkan semua file yang ada di kedua direktori menggunakan diffperintah. Apakah ada opsi baris perintah sederhana untuk melakukannya, atau apakah saya harus menulis skrip shell untuk mendapatkan daftar file dan kemudian beralih melalui mereka?

Jawaban:


422

Anda dapat menggunakan diffperintah untuk itu:

diff -bur folder1/ folder2/

Ini akan menghasilkan diff rekursif yang mengabaikan spasi, dengan konteks terpadu:

  • b flag berarti mengabaikan spasi putih
  • u flag berarti konteks terpadu (3 baris sebelum dan sesudah)
  • r flag artinya rekursif

9
Anda dapat memiliki akses ke diffperintah dengan mengunduh utilitas GNU untuk Win32 .
Laurent Etiemble

7
Saya juga menemukan bahwa opsi --brief berguna; Anda mendapatkan daftar file yang diubah dan dapat memprosesnya secara terpisah
Dariusz

27
Bagi yang lain ingin tahu, -babaikan perubahan spasi putih dan -uberikan 3 baris buffer.
rattray

28
Lebih mudah untuk mengingat perintah ini jika Anda menggunakan gosok bukannya bur yaitudiff -rub folder1/ folder2/
SomeGuyOnAComputer

11
Saya membayangkan -burakan mudah diingat jika Anda hidup di iklim yang dingin.
AlanH

126

Jika Anda hanya tertarik untuk melihat file yang berbeda, Anda dapat menggunakan:

diff -qr dir_one dir_two | sort

Opsi "q" hanya akan menampilkan file yang berbeda tetapi tidak konten yang berbeda, dan "mengurutkan" akan mengatur output berdasarkan abjad.


1
Sangat bagus! Juga berfungsi secara efisien - yaitu jika seluruh sub-direktori hanya ada di salah satu dir, berhenti berulang ke dalamnya dan melaporkan hanya sub-direktori itu sendiri (tanpa itu penerus konten). sangat bagus!!
SomethingSomething

Ini adalah benar-benar baik langkah pertama: melihat apa, jika ada, tidak berbeda, dan kemudian melakukan rinci diffpada setiap pasangan yang berbeda file. Pendekatan seseorang akan sangat berbeda jika hanya satu atau dua file berbeda dibandingkan jika puluhan file berbeda. Saya bisa tersesat dalam output dari difflusinan file sekaligus!
jvriesem

Juga, dapat termasuk -x PATTERNdalam perintah untuk mengecualikan subdirektori tertentu. Sebagai contoh, diff -qr repo1 repo2 -x ".git"akan membandingkan dua direktori (repo1 dan repo2) tetapi akan mengecualikan file dalam folder .git dari masing-masing direktori.
ViFI

20

Diff memiliki opsi -ryang dimaksudkan untuk melakukan hal itu.

diff -r dir1 dir2


11

difftidak hanya dapat membandingkan dua file, ia dapat, dengan menggunakan -ropsi, berjalan di seluruh pohon direktori, secara rekursif memeriksa perbedaan antara subdirektori dan file yang terjadi pada titik yang sebanding di setiap pohon.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

Jika itu GNU diff maka Anda hanya bisa mengarahkannya ke dua direktori dan menggunakan opsi -r.

Kalau tidak, coba gunakan

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB Seperti yang ditunjukkan oleh Dennis di bagian komentar, Anda sebenarnya tidak perlu melakukan substitusi perintah pada ls. Saya sudah melakukan ini begitu lama sehingga saya cukup banyak melakukan ini dengan autopilot dan mengganti perintah yang saya butuhkan untuk mendapatkan daftar file untuk perbandingan.

Saya juga lupa menambahkan bahwa saya melakukan '\ ls' untuk menonaktifkan sementara alias saya ke GNU ls sehingga saya kehilangan info pemformatan warna dari daftar yang dikembalikan oleh GNU ls.


2
Tidak perlu menggunakan ls:for i in ./dir1/*
Dijeda sampai pemberitahuan lebih lanjut.

1
@Dennis, pintasan funky. +1. Saya sangat terbiasa melakukan substitusi perintah meskipun itu otomatis dan saya hanya menggunakan perintah yang pernah saya butuhkan, misalnya kadang-kadang saya menggunakan find. Menggunakan ls juga memungkinkan saya bermain dengan daftar dir lebih banyak, misalnya berdasarkan waktu mundur bukan urutan default.
Rob Wells

0

Berikut ini skrip untuk menunjukkan perbedaan antar file dalam dua folder. Ini bekerja secara rekursif. Ubah dir1 dan dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

Jika Anda secara khusus tidak ingin membandingkan konten file dan hanya memeriksa mana yang tidak ada di kedua direktori, Anda dapat membandingkan daftar file, yang dihasilkan oleh perintah lain.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'memberitahu finduntuk tidak awalan jalur keluaran dengan direktori root.

Saya juga menambahkan sortuntuk memastikan urutan file akan sama di kedua panggilan find.

Pada grepakhirnya menghapus informasi tentang jalur input yang identik.


-4

Coba ini:

diff -rq /path/to/folder1 /path/to/folder2      

2
Ini menggandakan jawaban yang ada dan tidak menambahkan konten baru. Tolong jangan memposting jawaban kecuali Anda benar-benar memiliki sesuatu yang baru untuk disumbangkan.
Toby Speight
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.