Есть ли в Linux инструмент глубокого сравнения, который также сравнивает атрибуты файлов?

17

Существует ли инструмент Linux, такой как diff, который будет рекурсивно сравнивать файлы и каталоги, но с добавлением также сравнения: расширенные атрибуты, acl, se контексты?

Майкл Ганц
источник
1
Приведенные ответы работают для периодических сравнений. Но они не подходят для таких сравнений много раз в час при тестировании программного обеспечения. Я мог бы склоняться изменить исходный код diff, чтобы включить эти сравнения.
Майкл Ганц

Ответы:

7

Я сделал это перед использованием rsync -aHAX --deleteзапоминания , чтобы добавить -nи -iфлаги.

Это немного нелогично, но терпите меня. Основная rsyncкоманда - это то, что вам нужно для синхронизации двух каталогов вместе. Но -n -iзаставляет его НЕ синхронизироваться (то есть делать пробный прогон) и просто распечатывать, что он сделал бы и почему. Это не фантастика, чтобы разобрать, но вы можете легко получить имя файла и передать lsили подобное.

Он будет рассматривать все, включая mtimes, даты и т. Д., А также не следить за узлами устройств, сокетами, именованными каналами и т. Д. В командной строке также рассматриваются ACL и расширенные атрибуты. Вы можете настроить то , что вы смотрите на, изменив параметры в rsync, ограничить его к одному устройству с -x, изменением Soft & жестким поведением ссылок и т.д. и т.п.

abligh
источник
2

Янош уже сказал, что делать:

find /a -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >a
find /b -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >b

diff -u a b

И man 1 statговорит:

%A     access rights in human readable form
%C     SELinux security context string
%F     file type
%g     group ID of owner
%u     user ID of owner
%s     total size, in bytes
%Y     time of last modification, seconds since Epoch
%n     file name

Для сравнения содержимого файла вы можете использовать:

find -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-

as described here: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash

источник
Это решение не обеспечивает работоспособное решение. Отображаемая разница не зависит от контекста и слишком сложна для чтения. Я ищу что-то, что может показать мне имя файла и что в нем отличается. Не различие двух находок, которое является совершенно другим животным.
Майкл Ганц
1
GNU findимеет statвстроенные функции GNU (и предшествует статистике GNU десятилетиями). Вы также захотите отсортировать вывод перед диффузией. И вам нужно, (cd /a && find . ...)иначе все строки будут отличаться из-за /avs /bв пути к файлу.
Стефан Шазелас
0

Вот быстрый скрипт bash, который я написал для сравнения расширенных атрибутов. Он распечатывает каждое имя файла, а затем любые различия в атрибутах:

cd a
export relpath=[path/to/b/from/a]

for filename in $(find .);
do
    echo $filename;
    diff <(xattr -l $filename) <(xattr -l $relpath/$filename);
done

Заимствуя из другого ответа, мы можем изменить это, чтобы использовать statвместо xattr:

for filename in $(find .);
do
    echo $filename;
    diff <(stat -c '%A %C %F %g %u %s %Y' $filename) <(stat -c '%A %C %F %g %u %s %Y' $relpath/$filename);
done
Аарон Кэмпбелл
источник