Чи існує інструмент глибокої різниці Linux, який також порівнює атрибути файлів?


17

Чи є такий інструмент Linux, як diff, який буде рекурсивно порівнювати файли та каталоги, але з додаванням також порівнювати: розширені атрибути, контексти acl, se?


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

Відповіді:


7

Я робив це, перш ніж використовувати rsync -aHAX --deleteзапам'ятовуючи, щоб додати -nі -iпрапори.

Це трішки контрінтуїтивно, але потерпіть мене. Основна rsyncкоманда - те, що вам потрібно було б синхронізувати два каталоги разом. Але -n -iвін змушує НЕ синхронізувати (тобто робити сухий пробіг), а просто роздруковує, що це робило б і чому. Це не фантастично для розбору, але ви можете легко отримати ім'я файлу і передати його на lsабо подібне.

Тут буде розглянуто все, включаючи mtimes, дати тощо, а також не слідкувати за вузлами пристроїв, розетками, названими трубами тощо. Командний рядок також розглядає ACL та розширені атрибути. Ви можете налаштувати те, що ви дивитесь, змінивши параметри rsync, обмежити його одним пристроєм -x, змінити функцію м'якого та жорсткого зв’язку тощо тощо.


2

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

Це рішення не забезпечує працездатного рішення. Відмінність, яка відображається, не є контекстною і занадто складною для читання. Я шукаю щось, що може показати мені ім'я файлу, і чим він відрізняється. Не відрізняється двома знахідками, що зовсім інший звір.
Майкл Ганц

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.