¿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?
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.
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
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
Respuestas:
He hecho esto antes de usar
rsync -aHAX --delete
recordar para agregar las banderas-n
y-i
.Esto es un poco contradictorio, pero tengan paciencia conmigo. El
rsync
comando principal es lo que necesitarías para sincronizar los dos directorios juntos. Pero-n -i
hace 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 canalizarlols
o 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.fuente
janos ya dijo qué hacer:
Y
man 1 stat
dice:Para comparar el contenido del archivo puede usar:
fuente
find
tiene las características de GNUstat
integradas (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/a
vs/b
en la ruta del archivo.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:
Tomando prestado de otra respuesta, podemos modificar esto para usarlo en
stat
lugar dexattr
:fuente