Bagaimana cara membedakan nama file dalam dua direktori (tanpa menulis ke file perantara)?

31

Saya mencoba melakukan sesuatu seperti:

diff `ls -1a ./dir1` `ls -1a ./dir2`

Tapi itu tidak berhasil karena alasan yang jelas. Apakah ada cara yang lebih baik untuk mencapai ini (dalam 1 baris), daripada ini?

ls -1a ./dir1 > lsdir1
ls -1a ./dir2 > lsdir2
diff lsdir1 lsdir2

Terima kasih

bguiz
sumber

Jawaban:

47

Anda sudah dekat. Dalam bash Anda ingin proses substitusi , bukan perintah substitusi:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)
Ignacio Vazquez-Abrams
sumber
Proses substitusi tidak diperlukan. Jawaban di bawah ini ( superuser.com/a/228773/566289 ) ada benarnya!
Jan D
Kecuali jawaban itu berbeda konten, bukan nama file!
hilang
10
diff -rq dir1 dir2

menggunakan opsi -r, berjalan seluruh pohon direktori, memeriksa perbedaan antara subdirektori dan file yang terjadi pada titik-titik yang sebanding di setiap pohon. Caranya adalah dengan menggunakan opsi -q untuk menekan perbandingan baris per baris

fseto
sumber
3
@festo: Anda akan kehilangan poitn dari pertanyaan ini, saya tidak benar-benar ingin membedakan isi file, saya ingin mengubah output dari lsperintah
bguiz
+1, Sebenarnya, saya mendapatkan output yang sama dengan satu peringatan, diff -rq melaporkan file yang ditautkan sebagai 'Tidak ada file atau direktori'. Jadi, ditambah satu untuk penggunaan yang benar, dan terus terang lebih sederhana. (bahkan jika jawaban IVA adalah 'kesempatan belajar' yang lebih baik untuk penggantian proses (> _ <)
xtian
1
Ini jauh lebih lambat daripada membedakan nama file: keseluruhan dari setiap file harus dibaca dan dibandingkan.
Zaz
@ Ya tentu saja, karena itu secara rekursif ....
Braiam
1
@Braiam: Sekalipun Anda secara rekursif membedakan nama file (menggunakan rsyncdengan --dry-runopsi, misalnya), itu masih akan jauh lebih cepat daripada diff -r.
Zaz