Saya memiliki dua direktori yang harus berisi file yang sama dan memiliki struktur direktori yang sama.
Saya pikir ada sesuatu yang hilang di salah satu direktori ini.
Menggunakan bash shell, adakah cara untuk membandingkan direktori saya dan melihat apakah salah satu dari mereka ada file yang hilang di yang lain?
command-line
AndreaNobili
sumber
sumber
bash --version
?Jawaban:
Cara yang baik untuk melakukan perbandingan ini adalah dengan menggunakan
find
denganmd5sum
, makadiff
.Contoh
Gunakan find untuk membuat daftar semua file di direktori kemudian menghitung hash md5 untuk setiap file dan pipa itu diurutkan berdasarkan nama file ke file:
Lakukan prosedur yang sama ke direktori lain:
Kemudian bandingkan hasil dua file dengan
diff
:Atau sebagai perintah tunggal menggunakan proses substitusi:
Jika Anda hanya ingin melihat perubahan:
Perintah cut hanya mencetak hash (bidang pertama) untuk dibandingkan dengan diff. Jika tidak, diff akan mencetak setiap baris karena jalur direktori berbeda walaupun hashnya sama.
Tetapi Anda tidak akan tahu file mana yang berubah ...
Untuk itu, Anda dapat mencoba sesuatu seperti
Strategi ini sangat berguna ketika dua direktori yang akan dibandingkan tidak berada di mesin yang sama dan Anda perlu memastikan bahwa file-file tersebut sama di kedua direktori.
Cara lain yang baik untuk melakukan pekerjaan itu adalah menggunakan
diff
perintah Git (dapat menyebabkan masalah ketika file memiliki izin yang berbeda -> setiap file terdaftar dalam output kemudian):sumber
find
daftar file akan berbeda secara umum antara dua direktori.Anda dapat menggunakan
diff
perintah seperti halnya Anda menggunakannya untuk file:Jika Anda ingin melihat subfolder dan -file juga, Anda dapat menggunakan
-r
opsi:sumber
diff
berfungsi untuk direktori juga (man diff mengkonfirmasi hal itu), tetapi ini tidak secara rekursif memeriksa perubahan dalam subdirektori di dalam subdirektori.a/b/c/d/a
,x/b/c/d/b
. Lihat apa yangdiff a x
memberi Anda.-r
opsi ini. Itu (diff -r a x
) memberi saya:Only in a/b/c/d: a. only in x/b/c/d: b.
Melalui Anda tidak menggunakan bash, Anda dapat melakukannya menggunakan diff dengan
--brief
dan--recursive
:The
man diff
termasuk kedua pilihan:sumber
Berikut ini adalah alternatif, untuk membandingkan hanya nama file, dan bukan isinya:
Ini adalah cara mudah untuk membuat daftar file yang hilang, tetapi tentu saja tidak akan mendeteksi file dengan nama yang sama tetapi isinya berbeda!
(Secara pribadi saya menggunakan
diffdirs
skrip saya sendiri , tetapi itu adalah bagian dari perpustakaan yang lebih besar .)sumber
diff
tidak mendukung seperti yang sekarang. Tetapi adacomm
yang mendukungnya sejak git.savannah.gnu.org/cgit/coreutils.git/commit/... jadi setelah sampai pada coreutil di dekat Anda, Anda dapat melakukannyacomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(yang hasilnya mungkin harus Anda konversi lebih jauh dalam format Anda perlu menggunakan--output-delimiter
parameter dan alat tambahan).Mungkin satu opsi adalah menjalankan rsync dua kali:
Dengan baris sebelumnya, Anda akan mendapatkan file yang ada di dir1 dan berbeda (atau tidak ada) di dir2.
Sama untuk dir2
Anda dapat menghapus
-n
opsi untuk menjalani perubahan. Yaitu menyalin daftar file ke folder kedua.Jika Anda melakukannya, mungkin pilihan yang baik adalah menggunakan
-u
, untuk menghindari menimpa file yang lebih baru.Satu kalimat:
sumber
Jika Anda ingin membuat setiap file diperluas dan dapat dilipat, Anda dapat menyalurkan output
diff -r
ke Vim.Pertama mari kita beri Vim aturan lipat:
Sekarang hanya:
Anda dapat menekan
zo
danzc
membuka dan menutup lipatan. Untuk keluar dari Vim, tekan:q<Enter>
sumber
Tugas yang cukup mudah untuk dicapai dengan python:
Mengganti nilai aktual untuk
DIR1
danDIR2
.Berikut contoh dijalankan:
Agar mudah dibaca, inilah skrip aktual alih-alih satu baris:
sumber
os.listdir
tidak memberikan urutan tertentu. Jadi daftar mungkin memiliki hal yang sama dalam urutan berbeda dan perbandingannya akan gagal.Terinspirasi oleh balasan Sergiy, saya menulis skrip Python saya sendiri untuk membandingkan dua direktori.
Tidak seperti banyak solusi lain, itu tidak membandingkan konten file. Juga tidak masuk ke dalam subdirektori yang tidak ada di salah satu direktori. Jadi hasilnya cukup ringkas dan skrip bekerja cepat dengan direktori besar.
Jika Anda menyimpannya ke file bernama
compare_dirs.py
, Anda bisa menjalankannya dengan Python3.x:Output sampel:
PS Jika Anda perlu membandingkan ukuran file dan hash file untuk kemungkinan perubahan, saya menerbitkan skrip yang diperbarui di sini: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
sumber
cmpdirs dir1 dir2 '/\.git/'
Saya akan menambahkan daftar ini alternatif NodeJs yang saya tulis beberapa waktu lalu.
dir-bandingkan
sumber
Saya ingin menyarankan alat hebat yang baru saja saya temukan: MELD .
Ini bekerja dengan baik dan semua yang dapat Anda lakukan dengan perintah
diff
pada sistem berbasis Linux, dapat direplikasi dengan antarmuka grafis yang bagus! Nikmatisumber