Eigentümer und Berechtigungen von Inhalten zweier Ordner vergleichen?


10

Wie vergleiche ich Eigentümer und Berechtigungen von Inhalten zweier Ordner? Gibt es so etwas wie einen diffBefehl, der zwei Ordner rekursiv vergleicht und Eigentümer- und Berechtigungsunterschiede anzeigt?

Antworten:


11

Die Lösung ist wie bei allen Dingen ein Perl-Skript:

#!/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 );
}

Weitere Informationen finden Sie unter http://perldoc.perl.org/functions/stat.html und http://perldoc.perl.org/File/Find.html , insbesondere statwenn Sie andere Dateiattribute vergleichen möchten.

Wenn Dateien nicht in Verzeichnis2, sondern in Verzeichnis1 vorhanden sind, wird sie auch ausgegeben, da statsie unterschiedlich sind.


Wenn Sie möchten, dass die Berechtigung im UNIX-Stil gedruckt wird, ist dies praktisch:printf ("Permissions for %s and %s are not the same (%04o != %04o)\n", $file1, $file2, $mode1 &07777, $mode2 &07777) if ( $mode1 != $mode2);
Marcus

3

Finden und stat:

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

Führen Sie dies in beiden Verzeichnissen aus und vergleichen Sie dann die beiden Auflistungsdateien.

Rettet dich vor den Übeln von Perl ...


1
Dann unterscheiden Sie einfach die Ergebnisse :)
CrazyMerlin

1

Stellen Sie sicher, dass die beiden Ordner bis zu einem gewissen Grad rekursiv identisch sind? Ich denke, der rsyncBefehl ist dafür sehr mächtig.

In Ihrem Fall können Sie ausführen:

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

Die verschiedenen Dateien oder Ordner werden als Befehlsausgabe aufgelistet.

Sie können das sehen , man rsyncfür eine vollständigere Beschreibung dieser Optionen.


Wenn Sie src_dir / anstelle von src_dir im obigen Befehl verwenden, wird der Inhalt nur dem Inhalt des dst_dir zugeordnet.
Bill Zhao

0

ls -al zeigt die Berechtigungen an, wenn sich beide im selben Ordner befinden, erhalten Sie ungefähr Folgendes:

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

Die 3. Spalte ist der Eigentümer, die 4. ist die Gruppe.


Umm, was ist mit dem Inhalt von temp und temp2?
CJC

Zwei Möglichkeiten: Öffnen Sie 2 Shells, gehen Sie in beide Ordner und führen Sie denselben Befehl ls -al aus, oder 1 Shell mit tmux oder gehen Sie einfach in einen Ordner. Führen Sie den Befehl in den anderen aus und führen Sie denselben Befehl erneut aus.
Lucas Kauffman

2
Diese Lösung wird nicht skaliert.
Artem Russakovskii

0

Wenn die beiden Verzeichnisse dieselbe Struktur haben und Sie treeinstalliert haben, können Sie die Verzeichnisse wie folgt unterscheiden:

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.