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