¿Comparando propietarios y permisos de contenido de dos carpetas?

10

¿Cómo comparar propietarios y permisos de contenido de dos carpetas? ¿Hay algo como un diffcomando que compare recursivamente dos carpetas y muestre las diferencias de propietario y permisos?

J.Olufsen
fuente

Respuestas:

11

La solución, como con todas las cosas, es un script perl:

#!/usr/bin/perl

use File::Find;

my $directory1 = '/tmp/temp1';
my $directory2 = '/tmp/temp2';

find(\&hashfiles, $directory1);

sub hashfiles {
  my $file1 = $File::Find::name;
  (my $file2 = $file1) =~ s/^$directory1/$directory2/;

  my $mode1 = (stat($file1))[2] ;
  my $mode2 = (stat($file2))[2] ;

  my $uid1 = (stat($file1))[4] ;
  my $uid2 = (stat($file2))[4] ;

  print "Permissions for $file1 and $file2 are not the same\n" if ( $mode1 != $mode2 );
  print "Ownership for $file1 and $file2 are not the same\n" if ( $uid1 != $uid2 );
}

Mire http://perldoc.perl.org/functions/stat.html y http://perldoc.perl.org/File/Find.html para obtener más información, particularmente la statque desea comparar otros atributos de archivo.

Si los archivos no existen en el directorio2 pero existen en el directorio1, también habrá salida porque statserá diferente.

cjc
fuente
Si desea que se imprima el permiso en estilo UNIX, esto es útil:printf ("Permissions for %s and %s are not the same (%04o != %04o)\n", $file1, $file2, $mode1 &07777, $mode2 &07777) if ( $mode1 != $mode2);
Marcus
3

Buscar y estadísticas:

find . -exec stat --format='%n %A %U %G' {} \; | sort > listing

Ejecútelo en ambos directorios y luego compare los dos archivos de listado.

Te salva de los males de Perl ...

Ben
fuente
1
Entonces simplemente diferencie los resultados :)
CrazyMerlin 01 de
1

¿Se asegura de que las 2 carpetas deben ser las mismas de forma recursiva hasta cierto punto? Creo que el rsynccomando es muy poderoso para eso.

En su caso, puede ejecutar:

rsync  -n  -rpgov src_dir dst_dir  
(-n is a must otherwise dst_dir will be modified )

Los diferentes archivos o carpetas se enumerarán como salida del comando.

Puede ver man rsyncuna explicación más completa de estas opciones.

Bill Zhao
fuente
El uso de src_dir / en lugar de src_dir en el comando anterior hará que su contenido solo se asigne al contenido de dst_dir)
Bill Zhao
0

ls -al mostrará los permisos, si ambos están en la misma carpeta obtendrá algo como esto:

drwxr-xr-x 4 root  root 4096 nov 28 20:48 temp
drwxr-xr-x 2 lucas 1002 4096 mrt 24 22:33 temp2

La tercera columna es el propietario, la cuarta es el grupo.

Lucas Kauffman
fuente
Umm, ¿qué pasa con los contenidos de temp y temp2?
cjc
dos formas: abrir 2 shells, ir a ambas carpetas y hacer el mismo comando ls -al, o 1 shell con tmux o simplemente ir a una carpeta, hacer el comando ir a la otra y hacer el mismo comando nuevamente.
Lucas Kauffman
2
Esta solución no escalará.
Artem Russakovskii
0

Si los dos directorios tienen la misma estructura y usted ha treeinstalado, puede diferenciar los directorios haciendo:

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)
sk8asd123
fuente