Existe-t-il un outil de différenciation profonde Linux qui compare également les attributs de fichier?

17

Existe-t-il un outil Linux comme diff qui comparera récursivement les fichiers et les répertoires, mais avec en plus la comparaison: attributs étendus, acl, contextes se?

Michael Gantz
la source
1
Les réponses fournies fonctionnent pour faire des comparaisons de temps en temps. Mais, ils ne sont pas adéquats pour effectuer ces types de comparaisons plusieurs fois par heure lors des tests de logiciels. Je pourrais être enclin à modifier le code source diff pour inclure ces comparaisons.
Michael Gantz

Réponses:

7

J'ai fait cela avant d'utiliser le rsync -aHAX --deleterappel pour ajouter les drapeaux -net -i.

C'est un peu contre-intuitif, mais soyez indulgent avec moi. La rsynccommande principale est ce dont vous auriez besoin pour synchroniser les deux répertoires ensemble. Mais -n -iil ne se synchronise pas (c.-à-d. Effectue un essai à sec) et imprime simplement ce qu'il aurait fait et pourquoi. Il n'est pas fantastique d'analyser, mais vous pouvez facilement extraire le nom de fichier et le diriger vers lsou similaire.

Cela examinera tout, y compris mtimes, dates, etc., ainsi que ne pas suivre les nœuds de périphérique, les sockets, les canaux nommés, etc. La ligne de commande ci-dessus examine également les ACL et les attributs étendus. Vous pouvez ajuster ce que vous regardez en modifiant les options rsync, en le limitant à un seul appareil -x, en modifiant le comportement des liaisons souples et matérielles, etc., etc.

abligh
la source
2

janos a déjà dit quoi faire:

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

Et man 1 statdit:

%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

Pour comparer le contenu du fichier, vous pouvez utiliser:

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

la source
Cette solution ne fournit pas de solution viable. Le diff qui est affiché est sans contexte et trop difficile à lire. Je cherche quelque chose qui peut me montrer un nom de fichier et ce qui est différent à ce sujet. Pas un diff sur deux trouvailles qui est une bête complètement différente.
Michael Gantz
1
GNU finda les fonctionnalités de GNU statintégrées (et est antérieure à la statistique GNU de plusieurs décennies). Vous voudrez également trier la sortie avant de différer. Et vous avez besoin (cd /a && find . ...)sinon toutes les lignes différeront à cause de /avs /bdans le chemin du fichier.
Stéphane Chazelas
0

Voici un script bash rapide que j'ai écrit pour comparer les attributs étendus. Il affiche chaque nom de fichier, puis toutes les différences d'attributs:

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

Empruntant à une autre réponse, nous pouvons la modifier pour l'utiliser statau lieu de 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
Aaron Campbell
la source