Diberikan bash, ini mungkin yang paling mudah
$ comm <(ls -a dir1) <(ls -a dir2)
The <(command)
ekspresi berjalan perintah di atas pipa dan mensubstitusi /dev/fd
referensi:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Jadi perintah di atas berjalan ls -a
di setiap direktori dan mengumpankan output mereka sebagai argumen file comm
, yang menghasilkan hingga 3 kolom, tab-indent: entri hanya di pertama, entri di keduanya, entri di kedua. (Yaitu, jika berada di keduanya maka diindentasi oleh tab, jika hanya di kedua itu diindentasi oleh 2 tab.) Anda juga dapat menekan kolom dengan nomor: comm -1 foo bar
hanya menampilkan baris di keduanya dan baris di file kedua, yang terakhir indentasi oleh satu tab. (Ini paling umum digunakan dengan menekan semua kecuali kolom yang Anda inginkan: comm -13 foo bar
hanya menampilkan garis yang sama.)
Mengingat Anda menginginkan yang ada di direktori pertama, itu artinya
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Jika Anda membutuhkan lebih dari sekadar apakah itu ada, gunakan diff -r
, yang akan menghasilkan perbedaan untuk file yang sama dan pesan satu baris untuk file yang hanya ditemukan di satu atau yang lain.
ls
akan datang dengan semua masalah dengan ruang putih, tab, linefeed, backspaces dan semacamnya dalam nama file.ls -b
.find
. Tetapi keluhan utama sayafind
adalah bahwa itu adalah palu yang sangat berat untuk memukul apa yang biasanya merupakan lalat yang agak kecil.Dan di sini skrip murni. Ini adalah direktori a dan b:
Inilah perintahnya:
keluaran:
Tukar a dan b untuk file dalam tetapi tidak dalam b. Itu! adalah negasi. Tes -e untuk -Eksistensi. Dalam prosa: "Tes jika tidak ada file yang ditemukan di dalam ../b".
Catatan: Anda harus menyelami yang pertama, untuk mendapatkan nama tanpa 'a'. Untuk perbandingan kedua Anda harus cd
../b
.sumber
Jika Anda lebih suka alat grafis, gunakan
Anda mungkin harus menginstalnya terlebih dahulu. Program serupa adalah
Komandan tengah malam memiliki
compare directories
perintah built in, yang berfungsi dengan baik, jika Anda tidak memilih subdir.sumber
Anda bisa menggunakan
join
perintah yang diabaikan . Di sini beberapa setup untuk dua contoh direktori, d1 / dan d2 /, masing-masing memiliki beberapa file dengan nama unik untuk direktori, dan beberapa file dengan nama yang sama dengan direktori lainnya. Ini hanya sebuah contoh, jadi saya menggunakan nama file satu huruf untuk menggambarkan nama file yang unik untuk satu atau yang lain, dan nama file yang sama.Bagi saya, ini menunjukkan file seperti ini:
UPDATE: Anda ingin melakukan hal-hal yang berbeda dalam kehidupan nyata untuk mengakomodasi file dengan spasi putih di dalamnya, seperti
join
menggunakan bidang pertama "dibatasi oleh spasi putih" untuk memutuskan baris mana yang unik dan baris mana yang umum.sumber
join -t ''
(tanpa pembatas) akan membantu kasus itu.d2/f
tapid2/f
. Tab dan baris baru dalam nama file jarang terjadi, tetapi diizinkan.Anda dapat menggunakan
find
danawk
mengatasi ini.Dengan tata letak berikut:
Bagian satu:
Bagian kedua:
Ini dibandingkan dengan
comm
solusi:Dan untuk
join
solusi:sumber
gunakan fungsi saya:
sumber