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?

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.


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 ...


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.


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.


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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.