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