Чи є такий інструмент 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 . ...)
інакше всі рядки будуть відрізнятися через /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