Для версії 3.3 або пізнішої версії diffслід скористатися --no-dereferenceпараметром, описаним у відповіді Піта Харлана .
На жаль, старіші версії diff не підтримують ігнорування символьних посилань :
Деякі файли не є ні каталогами, ні звичайними файлами: це незвичайні файли, такі як символьні посилання, спеціальні файли пристрою, названі труби та сокети. В даний час diffобробляє символічні посилання, як звичайні файли; він розглядає інші спеціальні файли, як звичайні файли, якщо вони вказані на верхньому рівні, але просто повідомляє про їх наявність при порівнянні каталогів. Це означає, що patchне можна представляти зміни таких файлів. Наприклад, якщо ви змінюєте, на який файл вказує символічне посилання, diffвиводить різницю між двома файлами замість зміни на символічне посилання.
diffслід необов'язково повідомляти про зміни в спеціальних файлах спеціально, і їх patchслід розширити, щоб зрозуміти ці розширення.
Якщо все, що вам потрібно, це перевірити rsync (і, мабуть, виправити те, чого немає), тоді ви можете просто запустити команду rsync вдруге. Якщо ви цього не хочете, можливо, буде достатньо перевірити підбиття підсумків каталогу .
Якщо ви дійсно хочете зробити це за допомогою diff, ви можете скористатися findдля пропуску символьних посилань та запуску розрізних файлів для кожного файлу окремо. Введіть ваші каталоги a і b в якості аргументів:
#!/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
або як однолінійний:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
Це дозволить визначити файли, які відрізняються за змістом, або файли, що знаходяться в а, але не в b .
Зауважте, що:
- оскільки ми повністю пропускаємо посилання, це не помітить, якщо імена символьних посилань відсутні в b . Якщо вам цього потрібно, вам знадобиться другий пропуск для виявлення всіх символьних посилань, а потім чітко перевірити їх існування в b .
- Додаткові файли в b не будуть ідентифіковані, оскільки список побудований із вмісту a . Це, мабуть, не є проблемою для вашого
rsyncсценарію.