Apa cara terbaik dan paling sederhana untuk membandingkan dua struktur direktori tanpa benar-benar membandingkan data dalam file? Ini berfungsi dengan baik:
diff -qr dir1 dir2_
Tapi itu sangat lambat karena membandingkan file juga. Apakah ada saklar untuk diff atau alat cli sederhana untuk melakukan ini?
linux
comparison
Jonah
sumber
sumber
-type d
opsi dari jawaban @ slartibartfast, atau periksa jawaban saya.Jawaban:
Berikut ini (jika Anda mengganti direktori pertama untuk direktori1 dan yang kedua untuk direktori2) harus melakukan apa yang Anda cari dan cepat:
Prinsip dasarnya adalah bahwa ia mencetak semua direktori termasuk jalur subdirektori relatif terhadap direktori directoryN dasar.
Ini bisa jatuh (menghasilkan output aneh) jika Anda memiliki carriage return di beberapa nama direktori tetapi tidak yang lain.
sumber
diff -rq
hanya menunjukkan direktori root ada di satu, dan melanjutkan.akan memberi Anda tampilan sisi-sisi yang bagus dari dua hierarki direktori dengan setiap bagian umum dilipat.
sumber
Saya biasanya menggunakan
rsync
untuk tugas ini:HATI - HATI SANGAT HATI untuk selalu menggunakan opsi
-n
, alias--dry-run
, atau akan menyinkronkan (mengubah konten) direktori.Ini akan membandingkan file berdasarkan waktu dan ukuran modifikasi file ... Saya pikir itulah yang benar-benar Anda inginkan, atau setidaknya Anda tidak keberatan jika melakukan itu? Saya merasa bahwa Anda hanya ingin itu terjadi lebih cepat , bukan karena Anda perlu mengabaikan perbedaan antara isi file. Jika Anda ingin tidak mencantumkan file yang berbeda dengan nama yang sama, saya pikir penambahan
--ignore-existing
opsi akan melakukannya.Juga menyadari bahwa tidak menempatkan
/
pada akhirDIR1
akan menyebabkan ia membandingkan direktoriDIR1
dengan isi dariDIR2
.Hasil akhirnya sedikit bertele-tele, tetapi akan menunjukkan kepada Anda file / direktori mana yang berbeda. File / direktori yang ada
DIR2
dan tidakDIR1
akan diawali dengan katadeleting
.Untuk beberapa situasi, jawaban @ slartibartfast mungkin lebih sesuai, meskipun Anda harus menghapus
-type d
opsi untuk mengaktifkan daftar file non-direktori.rsync
akan lebih cepat jika Anda punya banyak file / direktori untuk dibandingkan.sumber
deleting...
teks tetapi mungkin salah satu cara yang lebih baik untuk membandingkan file sambil tetap mempertahankan kecepatan. Jawaban lain di sini lebih cepat ketika membedakan file tidak diperlukan ... seperti pada contoh OP, tapi saya sangat suka yang ini.sudo -u nobody rsync -nav --delete d1 d2
asalkan bendera untuk 'orang lain' memungkinkan membaca.Mirip dengan jawaban ls tetapi jika Anda menginstal pohon maka Anda bisa
sumber
diff <( tree dir1 ) <( tree dir2 )
i
bendera, yang tidak mencetak garis-garis pohon (tree -i dir1
, dll). Jika struktur direktori berbeda di satu tempat, file lain yang cocok mungkin memiliki lebih banyak atau lebih sedikit|
simbol dalam output pohon, dan diff akan menangkap garis-garis itu bahkan jika path file identik.Saya hanya mencari solusi untuk masalah ini. Solusi yang paling saya sukai adalah:
Ini memberi Anda 3 kolom: 1 - file hanya di DIR1, 2 - file hanya di DIR2, 3 - file hanya di DIR3 Untuk lebih jelasnya lihat posting blog ini .
sumber
DIR3
ditentukan? Yang saya lihat adalahDIR1
danDIR2
.DIR1
dalam kolom 1 , semua file hanya diDIR2
dalam kolom 2 , dan semua file dibagi oleh keduanya di kolom 3 . Itu semacam berguna, tetapi apakah Anda tahu bagaimana orang dapat menghapus kolom 3 dan hanya meninggalkan perbedaan? Saya memiliki banyak file untuk disortir, dan sebagian besar identik. Saya tidak perlu melihat apa yang sama.comm <(ls DIR1) <(ls DIR2)
itu tidak bekerja secara rekursif. Untuk itu saya gunakancomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
merangkak melalui direktori secara rekursif, danls -1
(perhatikan bahwa itu adalah satu , bukan L ) membuatls
cetak hanya satu nama file per baris.comm -3
(lihatman comm
).Kemudian cukup bedakan kedua daftar itu.
sumber
Ini adalah solusi optimal
--brief switch melaporkan hanya apakah file berbeda, bukan detail perbedaannya.
sumber
-q
di pertanyaan, yang merupakan alias untuk--brief
. Jawaban ini tidak memberikan informasi baru.But it's really slow because it's comparing files too.
gunakan "diff -qr" untuk mendapatkan file yang berbeda dan kemudian saring perbandingan file dengan grep agar hanya mendapatkan nama file yang hanya ada di salah satu direktori.
sumber
Ini berfungsi untuk kebutuhan spesifik saya untuk menemukan file yang hilang di pohon diharapkan cocok
sumber
Saya pikir hanya rsync yang userfull. Mengapa?
diff hanya berguna untuk struktur yang menyimpan file dan direktori. Diff tidak memberikan kode keluar yang memadai saat kami menggunakan symlink. Dalam situasi itu, diff dapat mengembalikan 2 kode keluar, bahkan jika src dan dst identik (waktu, ukuran, nama, cap waktu, menunjuk softlink, dll).
dir, filesystem tidak menjamin pemesanan file, bahkan jika isi direktori pada src dan dst identik. Mungkin Anda harus memfilter output ls dengan mengurutkannya. Tapi pure ls hanya menampilkan nama simpul.
mungkin skrip termasuk diff, cmp, test -X untuk tipe node akan berguna, tetapi ingat tentang kelebihan yang dibuat oleh banyak test / cmp berjalan. Script akan sangat lambat.
Seperti biasa, jika Anda ingin mendapatkan info sederhana "dirs is / not identik", Anda harus menggunakan rsync dengan opsi -n (kering). Jika Anda ingin menemukan apa yang berbeda, gunakan perintah diff.
sumber