Esiste uno strumento Linux deep diff che confronta anche gli attributi dei file?


17

Esiste uno strumento Linux come diff che confronterà in modo ricorsivo file e directory, ma con l'aggiunta del confronto: attributi estesi, acl, se contesti?


1
Le risposte fornite funzionano per il confronto occasionale. Tuttavia, non sono adeguati per fare questo tipo di confronti molte volte all'ora durante il test del software. Potrei essere propenso a modificare il codice sorgente del diff per includere questi confronti.
Michael Gantz,

Risposte:


7

L'ho fatto prima di usare il rsync -aHAX --deletericordare di aggiungere i flag -ne -i.

Questo è leggermente controintuitivo, ma abbi pazienza. Il rsynccomando principale è quello di cui avresti bisogno per sincronizzare le due directory insieme. Ma -n -ifa sì che NON si sincronizzi (cioè esegua una corsa a secco) e semplicemente stampi cosa avrebbe fatto e perché. Non è fantastico analizzarlo, ma è possibile estrarre facilmente il nome file e reindirizzare lso simili.

Questo esaminerà tutto, compresi mtime, date ecc., Oltre a non seguire su nodi dispositivo, socket, named pipe ecc. La riga di comando sopra esamina ACL e anche attributi estesi. È possibile regolare ciò che si sta visualizzando modificando le opzioni in rsync, limitandolo a un dispositivo con -x, modificando il comportamento dei collegamenti soft e hard ecc. Ecc.


2

Janos ha già detto cosa fare:

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

E man 1 statdice:

%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

Per confrontare il contenuto del file è possibile utilizzare:

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

Questa soluzione non fornisce una soluzione praticabile. Il diff che viene visualizzato è privo di contesto e troppo difficile da leggere. Sto cercando qualcosa che possa mostrarmi un nome di file e ciò che è diverso al riguardo. Non è una differenza su due reperti che è una bestia completamente diversa.
Michael Gantz,

1
GNU findha le funzionalità di GNU statintegrate (e precede le statistiche GNU di decenni). Ti consigliamo anche di ordinare l'output prima di diffing. E in caso (cd /a && find . ...)contrario è necessario che tutte le righe differiscano a causa di /avs /bnel percorso del file.
Stéphane Chazelas,

0

Ecco un breve script bash che ho scritto per confrontare gli attributi estesi. Stampa ogni nome di file e quindi eventuali differenze negli attributi:

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

Prendendo in prestito da un'altra risposta, possiamo modificarlo per usarlo al statposto di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.