Confronto tra proprietari e autorizzazioni del contenuto di due cartelle?


10

Come confrontare i proprietari e le autorizzazioni del contenuto di due cartelle? Esiste qualcosa di simile al diffcomando che confronta ricorsivamente due cartelle e visualizza le differenze di proprietario e autorizzazioni?

Risposte:


11

La soluzione, come per tutte le cose, è uno 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 );
}

Guarda http://perldoc.perl.org/functions/stat.html e http://perldoc.perl.org/File/Find.html per maggiori informazioni, in particolare statquello per confrontare altri attributi di file.

Se i file non esistono nella directory2 ma esistono nella directory1, ci sarà anche l'output perché statsarà diverso.


Se si desidera che l'autorizzazione sia stampata in stile UNIX, è 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

Trova e statistiche:

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

Eseguilo in entrambe le directory, quindi confronta i due file di elenco.

Ti salva dai mali del Perl ...


1
Quindi diff diff risultati :)
CrazyMerlin

1

Ti assicuri che le 2 cartelle dovrebbero essere le stesse in modo ricorsivo in una certa misura? Penso che il rsynccomando sia molto potente per questo.

Nel tuo caso puoi eseguire:

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

I diversi file o cartelle verranno elencati come output del comando.

Puoi vedere il man rsyncper una spiegazione più completa di queste opzioni.


usando src_dir / al posto di src_dir nel comando sopra si farà in modo che il suo contenuto sia semplicemente mappato al contenuto di dst_dir)
Bill Zhao,

0

ls -al mostrerà i permessi, se entrambi sono nella stessa cartella otterrai qualcosa del genere:

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 terza colonna è il proprietario, la quarta è il gruppo.


Umm, che dire dei contenuti di temp e temp2?
cjc

due modi: apri 2 shell vai in entrambe le cartelle e fai lo stesso comando ls -al, oppure 1 shell con tmux o semplicemente vai in una cartella fai il comando vai nell'altra e fai di nuovo lo stesso comando.
Lucas Kauffman,

2
Questa soluzione non si ridimensionerà.
Artem Russakovskii,

0

Se le due directory hanno la stessa struttura e sono state treeinstallate, è possibile diff le directory facendo:

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.