¿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?
¿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?
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 canalizarlo ls
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.
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 stat
dice:
%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
find
tiene las características de GNU stat
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:
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 stat
lugar 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