Существует ли инструмент Linux, такой как diff, который будет рекурсивно сравнивать файлы и каталоги, но с добавлением также сравнения: расширенные атрибуты, acl, se контексты?
Существует ли инструмент Linux, такой как diff, который будет рекурсивно сравнивать файлы и каталоги, но с добавлением также сравнения: расширенные атрибуты, acl, se контексты?
Ответы:
Я сделал это перед использованием rsync -aHAX --delete
запоминания , чтобы добавить -n
и -i
флаги.
Это немного нелогично, но терпите меня. Основная rsync
команда - это то, что вам нужно для синхронизации двух каталогов вместе. Но -n -i
заставляет его НЕ синхронизироваться (то есть делать пробный прогон) и просто распечатывать, что он сделал бы и почему. Это не фантастика, чтобы разобрать, но вы можете легко получить имя файла и передать ls
или подобное.
Он будет рассматривать все, включая mtimes, даты и т. Д., А также не следить за узлами устройств, сокетами, именованными каналами и т. Д. В командной строке также рассматриваются ACL и расширенные атрибуты. Вы можете настроить то , что вы смотрите на, изменив параметры в rsync
, ограничить его к одному устройству с -x
, изменением Soft & жестким поведением ссылок и т.д. и т.п.
Янош уже сказал, что делать:
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
find
имеет stat
встроенные функции GNU (и предшествует статистике GNU десятилетиями). Вы также захотите отсортировать вывод перед диффузией. И вам нужно, (cd /a && find . ...)
иначе все строки будут отличаться из-за /a
vs /b
в пути к файлу.
Вот быстрый скрипт 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