Comparer les propriétaires et les autorisations du contenu de deux dossiers?

10

Comment comparer les propriétaires et les autorisations de contenu de deux dossiers? Existe-t-il quelque chose comme une diffcommande qui compare récursivement deux dossiers et affiche les différences de propriétaire et d'autorisations?

J.Olufsen
la source

Réponses:

11

La solution, comme pour tout, est 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 );
}

Consultez http://perldoc.perl.org/functions/stat.html et http://perldoc.perl.org/File/Find.html pour plus d'informations, en particulier statcelle si vous souhaitez comparer d'autres attributs de fichier.

Si les fichiers n'existent pas dans le répertoire2 mais existent dans le répertoire1, il y aura également une sortie car le statsera différent.

cjc
la source
Si vous voulez que l'autorisation soit imprimée dans le style UNIX, cela vous sera utile:printf ("Permissions for %s and %s are not the same (%04o != %04o)\n", $file1, $file2, $mode1 &07777, $mode2 &07777) if ( $mode1 != $mode2);
Marcus
3

Rechercher et stat:

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

Exécutez cela dans les deux répertoires, puis comparez les deux fichiers de liste.

Vous sauve des maux de Perl ...

Ben
la source
1
Ensuite, différez les résultats :)
CrazyMerlin
1

Assurez-vous que les 2 dossiers doivent être les mêmes récursivement dans une certaine mesure? Je pense que la rsynccommande est très puissante pour cela.

Dans votre cas, vous pouvez exécuter:

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

Les différents fichiers ou dossiers seront répertoriés comme sortie de commande.

Vous pouvez voir le man rsyncpour une explication plus complète de ces options.

Bill Zhao
la source
en utilisant src_dir / à la place de src_dir dans la commande ci-dessus, son contenu sera simplement mis en correspondance avec le contenu de dst_dir)
Bill Zhao
0

ls -al affichera les autorisations, si les deux sont dans le même dossier, vous obtiendrez quelque chose comme ceci:

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 3ème colonne est le propriétaire, la 4ème est le groupe.

Lucas Kauffman
la source
Umm, qu'en est-il du contenu de temp et temp2?
cjc
deux façons: ouvrir 2 shells aller dans les deux dossiers et faire la même commande ls -al, ou 1 shell avec tmux ou simplement aller dans un dossier faire la commande aller dans l'autre et refaire la même commande.
Lucas Kauffman
2
Cette solution ne sera pas mise à l'échelle.
Artem Russakovskii
0

Si les deux répertoires ont la même structure et que vous avez treeinstallé, vous pouvez différencier les répertoires en faisant:

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)
sk8asd123
la source