Для версии 3.3 или новее diffвы должны использовать эту --no-dereferenceопцию, как описано в ответе Пита Харлана .
К сожалению, старые версии diff не поддерживают игнорирование символических ссылок :
Некоторые файлы не являются ни каталогами, ни обычными файлами: это необычные файлы, такие как символические ссылки, специальные файлы устройств, именованные каналы и сокеты. В настоящее время diffобрабатывает символические ссылки как обычные файлы; он обрабатывает другие специальные файлы как обычные файлы, если они указаны на верхнем уровне, но просто сообщает об их наличии при сравнении каталогов. Это означает, что patchне может представлять изменения в таких файлах. Например, если вы изменяете, на какой файл указывает символическая ссылка, diffвыводится разница между двумя файлами вместо изменения символической ссылки.
diffпри необходимости должен специально сообщать об изменениях в специальные файлы и patchдолжен быть расширен для понимания этих расширений.
Если все, что вам нужно, это проверить rsync (и предположительно исправить то, что отсутствует), то вы можете просто запустить команду rsync во второй раз. Если вы не хотите этого делать, то проверки суммирования каталога может быть достаточно.
Если вы действительно хотите это сделать diff, то можете findпропустить символические ссылки и запустить diff для каждого файла в отдельности. Передайте ваши каталоги 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
Это идентифицирует файлы, которые отличаются по содержанию, или файлы, которые находятся в a, но не в b .
Обратите внимание, что:
- так как мы пропускаем символические ссылки полностью, это не заметит, если имена символических ссылок отсутствуют в b . Если вам необходимо, вам понадобится второй проход поиска, чтобы идентифицировать все символические ссылки, а затем явно проверить их существование в b .
- Дополнительные файлы в b не будут идентифицированы, так как список составлен из содержимого a . Это, вероятно, не проблема для вашего
rsyncсценария.