Comparando proprietários e permissões de conteúdo de duas pastas?

10

Como comparar proprietários e permissões de conteúdo de duas pastas? Existe algo como diffcomando que compara recursivamente duas pastas e exibe as diferenças de proprietário e permissão?

J.Olufsen
fonte

Respostas:

11

A solução, como em todas as coisas, é um 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 );
}

Veja http://perldoc.perl.org/functions/stat.html e http://perldoc.perl.org/File/Find.html para obter mais informações, especialmente a statque você deseja comparar com outros atributos de arquivo.

Se os arquivos não existirem no diretório2, mas existirem no diretório1, também haverá saída porque os arquivos statserão diferentes.

cjc
fonte
Se você deseja que a permissão seja impressa no estilo UNIX, isso é ú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

Localização e status:

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

Execute isso nos dois diretórios e compare os dois arquivos de listagem.

Salva você dos males de Perl ...

Ben
fonte
1
Em seguida, basta diff os resultados :)
CrazyMerlin
1

Você garante que as 2 pastas sejam as mesmas recursivamente até certo ponto? Eu acho que o rsynccomando é muito poderoso para isso.

No seu caso, você pode executar:

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

Os diferentes arquivos ou pastas serão listados como a saída do comando.

Você pode ver man rsyncuma explicação mais completa dessas opções.

Bill Zhao
fonte
usando src_dir / em vez de src_dir no comando acima irá tornar o seu conteúdo ser apenas mapeamento para o conteúdo do dst_dir)
Bill Zhao
0

ls -al mostrará as permissões, se os dois estiverem na mesma pasta, você obterá algo como isto:

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

A terceira coluna é o proprietário, a quarta é o grupo.

Lucas Kauffman
fonte
Umm, e o conteúdo de temp e temp2?
Cjc 24/03/12
de duas maneiras: abra 2 shells vão para as duas pastas e executam o mesmo comando ls -al, ou 1 shell com tmux ou apenas entram em uma pasta, o comando entra na outra e executa o mesmo comando novamente.
27412 Lucas Kauffman
2
Esta solução não será dimensionada.
Artem Russakovskii
0

Se os dois diretórios tiverem a mesma estrutura e você tiver treeinstalado, você poderá diferenciá-los fazendo:

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