Temukan file di satu direktori, bukan di direktori lain

12

Apakah ada alat Linux / Unix yang menemukan semua file dalam satu direktori tidak hadir di direktori lain? Pada dasarnya saya mencari diff yang berfungsi pada output ls.

Naskah pendek dan manis juga dihargai.

Willi Ballenthin
sumber

Jawaban:

20

diff sudah melakukan ini:

diff dir1 dir2

Contoh output:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
tobym
sumber
5
Ini bagus. Satu keluhan: diff sebenarnya berjalan pada masing-masing file yang ada di keduanya. Apakah ada opsi yang tidak jelas untuk hanya menjalankan terhadap nama file (saya mungkin melewatkannya)? Kalau tidak, saya sarankandiff dir1 dir2 | grep "Only"
Willi Ballenthin
wow ini hanya menyelamatkan saya beberapa menit dari bash scripting terima kasih
user5359531
10

Pesta:

diff <(cd dir1; ls) <(cd dir2; ls)

Bandingkan hanya nama file - bukan isi file.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Juga ksh dan zsh.
Dijeda sampai pemberitahuan lebih lanjut.
gunakan rsync untuk sinkronisasi dirs
c4f4t0r
Jangan parsing ls, gunakan findsaja!
val berkata Reinstate Monica
4

Seperti yang dikatakan orang di sini, Anda dapat menggunakan DIFF dalam berbagai variasi penggunaan. Atau Anda hanya menggunakan dirdiff, yang dimaksudkan untuk apa yang Anda coba! :-)

Tetapi jika Anda ingin menyimpan beberapa direktori dalam sinkronisasi maka Anda benar-benar harus melihatnya rsync.

Salam

Januari
sumber
3

Jika Anda ingin melakukan ini melalui semua sub direktori juga, cara yang baik untuk melakukannya adalah:

diff --brief -r dir1/ dir2/

Saya lebih suka menggunakan brief, tetapi Anda bisa mengabaikannya jika mau.

trueCamelType
sumber
1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done

James L.
sumber
0

Ini bekerja..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
Warner
sumber
0

belum dicoba:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done
Javier
sumber
0

Dennis Williamson punya jawaban yang bagus , tetapi saya perlu melakukan ini secara rekursif. GNU findutils 4.7.0 tidak mengurutkan outputnya, jadi inilah yang saya gunakan

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

Untuk melakukan ini hanya satu cara, dan menghasilkan daftar file, saya menggunakan ini:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

Agar ini berfungsi dengan baik, $ dir1 atau $ dir2 tidak boleh menyertakan trailing slash.

sondra.kinsey
sumber