Untuk versi 3.3 atau yang lebih baru diff
, Anda harus menggunakan --no-dereference
opsi, seperti yang dijelaskan dalam jawaban Pete Harlan .
Sayangnya, versi lama dari diff
tidak mendukung pengabaian symlink :
Beberapa file bukan direktori atau file biasa: mereka adalah file yang tidak biasa seperti tautan simbolik, file khusus perangkat, pipa bernama, dan soket. Saat ini, diff
memperlakukan tautan simbolik seperti file biasa; itu memperlakukan file khusus lainnya seperti file biasa jika mereka ditentukan di tingkat atas, tetapi hanya melaporkan keberadaan mereka ketika membandingkan direktori. Ini berarti bahwa patch
tidak dapat mewakili perubahan pada file tersebut. Misalnya, jika Anda mengubah file mana yang ditunjuk oleh tautan simbolik, diff
mengeluarkan perbedaan antara kedua file tersebut, alih-alih mengubah ke tautan simbolik.
diff
harus melaporkan perubahan ke file khusus secara khusus, dan patch
harus diperluas untuk memahami ekstensi ini.
Jika yang Anda inginkan adalah memverifikasi rsync (dan mungkin memperbaiki apa yang hilang), maka Anda bisa menjalankan perintah rsync untuk kedua kalinya. Jika Anda tidak ingin melakukan itu, maka memeriksa-menjumlahkan direktori mungkin sudah cukup.
Jika Anda benar-benar ingin melakukan ini diff
, maka Anda dapat menggunakan find
untuk melewati symlink, dan menjalankan diff pada setiap file secara individual. Lewati direktori Anda a dan b sebagai argumen:
#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
atau sebagai one-liner:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
Ini akan mengidentifikasi file yang berbeda dalam isi, atau file yang berada di sebuah tetapi tidak dalam b .
Perhatikan bahwa:
- karena kita melewatkan symlink sepenuhnya, ini tidak akan melihat jika nama symlink tidak ada di b . Jika Anda mengharuskan itu, Anda akan memerlukan pass menemukan kedua untuk mengidentifikasi semua symlink dan kemudian secara eksplisit memeriksa keberadaannya di b .
- File tambahan dalam b tidak akan diidentifikasi, karena daftar dibuat dari isi a . Ini mungkin bukan masalah untuk
rsync
skenario Anda .