Для версії 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
сценарію.