¿Existe una herramienta de diferencias profundas de Linux que también compare los atributos de los archivos?

17

¿Existe una herramienta de Linux como diff que compare archivos y directorios de forma recursiva, pero con la adición de también comparar: atributos extendidos, acl's, contextos se?

Michael Gantz
fuente
1
Las respuestas proporcionadas funcionan para hacer comparaciones de vez en cuando. Pero no son adecuados para hacer este tipo de comparaciones muchas veces por hora cuando se prueba un software. Podría estar inclinado a modificar el código fuente diff para incluir estas comparaciones.
Michael Gantz

Respuestas:

7

He hecho esto antes de usar rsync -aHAX --deleterecordar para agregar las banderas -ny -i.

Esto es un poco contradictorio, pero tengan paciencia conmigo. El rsynccomando principal es lo que necesitarías para sincronizar los dos directorios juntos. Pero -n -ihace que NO se sincronice (es decir, haga una ejecución en seco) e simplemente imprima lo que hubiera hecho y por qué. No es fantástico analizarlo, pero puede obtener el nombre de archivo fácilmente y canalizarlo lso similar.

Esto analizará todo, incluyendo mtimes, fechas, etc., así como no seguir en nodos de dispositivos, sockets, canalizaciones con nombre, etc. La línea de comando anterior también analiza las ACL y los atributos extendidos. Puede ajustar lo que está mirando al cambiar las opciones rsync, limitarlo a un dispositivo -x, cambiar el comportamiento del enlace suave y duro, etc., etc.

abligh
fuente
2

janos ya dijo qué hacer:

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

Y 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

Para comparar el contenido del archivo puede usar:

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

fuente
Esta solución no proporciona una solución viable. La diferencia que se muestra no tiene contexto y es demasiado difícil de leer. Estoy buscando algo que pueda mostrarme un nombre de archivo y qué tiene de diferente. No es una diferencia en dos hallazgos, que es una bestia completamente diferente.
Michael Gantz
1
GNU findtiene las características de GNU statintegradas (y es anterior a las estadísticas de GNU por décadas). También querrá ordenar la salida antes de diferenciar. Y necesita lo (cd /a && find . ...)contrario, todas las líneas serán diferentes debido a /avs /ben la ruta del archivo.
Stéphane Chazelas
0

Aquí hay un script rápido de bash que escribí para comparar atributos extendidos. Imprime cada nombre de archivo, y luego cualquier diferencia en los atributos:

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

Tomando prestado de otra respuesta, podemos modificar esto para usarlo en statlugar 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
fuente