Чи є такий інструмент Linux, як diff, який буде рекурсивно порівнювати файли та каталоги, але з додаванням також порівнювати: розширені атрибути, контексти acl, se?
Чи є такий інструмент Linux, як diff, який буде рекурсивно порівнювати файли та каталоги, але з додаванням також порівнювати: розширені атрибути, контексти acl, se?
Відповіді:
Я робив це, перш ніж використовувати rsync -aHAX --deleteзапам'ятовуючи, щоб додати -nі -iпрапори.
Це трішки контрінтуїтивно, але потерпіть мене. Основна rsyncкоманда - те, що вам потрібно було б синхронізувати два каталоги разом. Але -n -iвін змушує НЕ синхронізувати (тобто робити сухий пробіг), а просто роздруковує, що це робило б і чому. Це не фантастично для розбору, але ви можете легко отримати ім'я файлу і передати його на lsабо подібне.
Тут буде розглянуто все, включаючи mtimes, дати тощо, а також не слідкувати за вузлами пристроїв, розетками, названими трубами тощо. Командний рядок також розглядає ACL та розширені атрибути. Ви можете налаштувати те, що ви дивитесь, змінивши параметри rsync, обмежити його одним пристроєм -x, змінити функцію м'якого та жорсткого зв’язку тощо тощо.
janos вже сказав, що робити:
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 . ...)інакше всі рядки будуть відрізнятися через /avs /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