Saya mencoba mencari file yang ada di satu direktori tetapi tidak di yang lain, saya mencoba menggunakan perintah ini:
diff -q dir1 dir2
Masalah dengan perintah di atas bahwa ia menemukan kedua file dalam dir1
tetapi tidak dalam dir2
serta file dalam dir2
tetapi tidak dalam dir1
,
Saya mencoba mencari file di dir1
tetapi tidak dir2
hanya di .
Berikut ini sedikit contoh tampilan data saya
dir1 dir2 dir3
1.txt 1.txt 1.txt
2.txt 3.txt 3.txt
5.txt 4.txt 5.txt
6.txt 7.txt 8.txt
Pertanyaan lain dalam benak saya adalah bagaimana saya dapat menemukan file dir1
tetapi tidak dalam dir2
atau dir3
dalam satu perintah?
grep
untuk STh seperti^dir1
untuk memastikan saya tidak mendapatkandir1
muncul kemudian di jalan.$4
sebagai contoh. Faktanya, pada Ubuntu saya yang sebenarnya,diff
balasan dalam bahasa Italia.$4
ok untuk balasan Italia dan Inggris, tapi saya tidak yakin untuk setiap bahasa lain ...Ini harus melakukan pekerjaan:
Opsi menjelaskan (melalui halaman manual diff (1) ):
-r
- Secara rekursif membandingkan subdirektori yang ditemukan.-q
- Keluaran hanya apakah file berbeda.sumber
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
opsi: Halaman manual hanya mengatakan "Keluarkan hanya apakah file berbeda", bukan bagaimana memeriksa apakah mereka berbeda. Saya meneliti kode sumber dan menemukan bahwa itu hanya memeriksa ukuran file untuk menentukan perbedaan, bukan konten yang sebenarnya.-q
opsi saya tidak dapat mereproduksi bahwa itu hanya memeriksa ukuran file. Menggunakan GNU Diffutils 3.7 membandingkan dua file dengan ukuran file yang sama tetapi konten berbeda dengandiff -q file1 file2
outputFiles file1 and file2 differ
.Perintah ini akan memberi Anda file yang ada di dir1 dan bukan di dir2.
Tentang
<( )
tanda, Anda dapat google sebagai 'proses substitusi'.sumber
(ls -R dir1|sort)
bisa melakukan trik(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
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 ke file:Lakukan prosedur yang sama ke direktori lain:
Kemudian bandingkan hasil dua file dengan "diff":
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 git
Salam Hormat!
sumber
Meld ( http://meldmerge.org/ ) melakukan pekerjaan yang baik dalam membandingkan direktori dan file di dalamnya.
sumber
Plugin DirDiff vim adalah alat lain yang sangat berguna untuk membandingkan direktori.
Itu tidak hanya daftar file mana yang berbeda antara direktori, tetapi juga memungkinkan Anda untuk memeriksa / memodifikasi dengan vimdiff file yang berbeda.
sumber
Tidak puas dengan semua balasan, karena kebanyakan dari mereka bekerja sangat lambat dan menghasilkan keluaran panjang yang tidak perlu untuk direktori besar, saya menulis skrip Python saya sendiri untuk membandingkan dua folder.
Tidak seperti banyak solusi lain, itu tidak membandingkan konten file. Juga tidak masuk ke dalam subdirektori yang hilang di direktori lain. Jadi hasilnya cukup ringkas dan skripnya bekerja dengan cepat.
Penggunaan sampel:
Atau jika Anda hanya ingin melihat file dari direktori pertama:
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
Pendekatan lain (mungkin lebih cepat untuk direktori besar):
The
sed
perintah menghapus pertama komponen direktori berkat posting Erik`s )sumber
find
karenanya komentar dan bukan jawaban yang terpisah):cd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
Ini akan mencetak file yang ada di dir2 tetapi tidak ada di dir1.Ini agak terlambat tetapi dapat membantu seseorang. Tidak yakin apakah diff atau rsync hanya memuntahkan nama file dalam format kosong seperti ini. Terima kasih kepada plhn karena memberikan solusi bagus yang saya kembangkan di bawah.
Jika Anda hanya ingin nama file sehingga mudah untuk menyalin file yang Anda butuhkan dalam format bersih, Anda dapat menggunakan perintah find.
Ini mengasumsikan bahwa kedua dir1 dan dir2 berada di folder induk yang sama. sed hanya menghapus folder induk sehingga Anda dapat membandingkan apel dengan apel. Sed terakhir hanya mengembalikan nama dir1.
Jika Anda hanya ingin file:
Demikian pula untuk direktori:
sumber
cd
sebelumfind
daripada harus digunakansed
, misalnya:comm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. (exit
S di sini untuk mencegahfind
penggunaan direktori saat ini haruscd
gagal.)comm
dengan dukungan-z
(datang dengan git.savannah.gnu.org/cgit/coreutils.git/commit/… ) yang dapat Anda lakukancomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
. (Sementara itu saya juga tahu bahwaexit
Jawaban yang diterima juga akan mencantumkan file yang ada di kedua direktori, tetapi memiliki konten yang berbeda. Untuk daftar HANYA file yang ada di dir1 Anda dapat menggunakan:
Penjelasan:
sumber
Jawaban ini mengoptimalkan salah satu saran dari @ Adail-Junior dengan menambahkan
-D
opsi, yang bermanfaat ketika tidak ada direktori yang dibandingkan adalah repositori git:Jika Anda menggunakan
-D
maka Anda tidak akan melihat perbandingan untuk/dev/null
:text Binary files a/whatever and /dev/null differ
sumber
Cara yang disederhanakan untuk membandingkan 2 direktori menggunakan perintah DIFF
buka filename.dat setelah proses selesai
dan Anda akan melihat: Hanya dalam nama file.1: nama file.2 Hanya di: directory_name: name_of_file1 Hanya di: directory_Name: name_of_file2
sumber
Ini adalah skrip bash untuk mencetak perintah untuk menyinkronkan dua direktori
sumber
GNU
grep
dapat membalikkan pencarian dengan opsi-v
. Ini membuatgrep
pelaporan garis, yang tidak cocok. Dengan ini, Anda dapat menghapus filedir2
dari daftar file didir1
.Opsi
-F -x
memberi tahugrep
untuk melakukan pencarian string di seluruh baris.sumber