Câu trả lời:
Giải pháp, như với tất cả mọi thứ, là một tập lệnh 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 );
}
Hãy xem http://perldoc.perl.org/fifts/stat.html và http://perldoc.perl.org/File/Find.html để biết thêm thông tin, đặc biệt là stat
nếu bạn muốn so sánh các thuộc tính tệp khác.
Nếu các tệp không tồn tại trong thư mục 2 nhưng tồn tại trong thư mục 1, thì cũng sẽ có đầu ra vì stat
sẽ khác nhau.
Tìm và thống kê:
find . -exec stat --format='%n %A %U %G' {} \; | sort > listing
Chạy nó trong cả hai thư mục sau đó so sánh hai tệp liệt kê.
Cứu bạn khỏi tệ nạn của Perl ...
Bạn có chắc chắn rằng 2 thư mục sẽ giống nhau theo cách đệ quy ở một mức độ nào đó không? Tôi nghĩ rằng rsync
lệnh này rất mạnh mẽ cho điều đó.
Trong trường hợp của bạn, bạn có thể chạy:
rsync -n -rpgov src_dir dst_dir
(-n is a must otherwise dst_dir will be modified )
Các tập tin hoặc thư mục khác nhau sẽ được liệt kê là đầu ra lệnh.
Bạn có thể xem phần man rsync
giải thích đầy đủ hơn về các tùy chọn này.
ls -al
sẽ hiển thị các quyền, nếu cả hai đều nằm trong cùng một thư mục, bạn sẽ nhận được một cái gì đó như thế này:
drwxr-xr-x 4 root root 4096 nov 28 20:48 temp
drwxr-xr-x 2 lucas 1002 4096 mrt 24 22:33 temp2
Cột thứ 3 là chủ sở hữu, cột thứ 4 là nhóm.
printf ("Permissions for %s and %s are not the same (%04o != %04o)\n", $file1, $file2, $mode1 &07777, $mode2 &07777) if ( $mode1 != $mode2);