So sánh chủ sở hữu và quyền của nội dung của hai thư mục?


10

Làm thế nào để so sánh chủ sở hữu và quyền của nội dung của hai thư mục? Có cái gì đó giống như difflệnh so sánh đệ quy hai thư mục và chủ sở hữu hiển thị và quyền khác nhau không?

Câu trả lời:


11

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.htmlhttp://perldoc.perl.org/File/Find.html để biết thêm thông tin, đặc biệt là statnế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ì statsẽ khác nhau.


Nếu bạn muốn quyền được in theo kiểu UNIX, điều này có ích:printf ("Permissions for %s and %s are not the same (%04o != %04o)\n", $file1, $file2, $mode1 &07777, $mode2 &07777) if ( $mode1 != $mode2);
Marcus

3

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


1
Sau đó, chỉ cần khác kết quả :)
CrazyMerlin

1

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 rsynclệ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 rsyncgiải thích đầy đủ hơn về các tùy chọn này.


sử dụng src_dir / thay cho src_dir trong lệnh trên sẽ làm cho nội dung của nó được ánh xạ tới nội dung của dst_dir)
Bill Zhao

0

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.


Umm, còn nội dung của temp và temp2 thì sao?
cjc

hai cách: mở 2 shell đi vào cả hai thư mục và thực hiện cùng một lệnh ls -al hoặc 1 shell với tmux hoặc chỉ cần đi vào một thư mục làm lệnh đi vào thư mục kia và thực hiện lại lệnh tương tự.
Lucas Kauffman

2
Giải pháp này sẽ không mở rộng.
Artem Russakovskii

0

Nếu hai thư mục có cùng cấu trúc và bạn đã treecài đặt, bạn có thể tìm các thư mục khác bằng cách thực hiện:

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.