Назад | Перейти на главную страницу

Сравнивая владельцев и разрешения содержимого двух папок?

Как сравнить владельцев и разрешения содержимого двух папок? Есть что-то вроде diff команда, которая рекурсивно сравнивает две папки и отображает различия в владельце и разрешениях?

Решением, как и во всем остальном, является сценарий 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 );
}

смотреть на http://perldoc.perl.org/functions/stat.html и http://perldoc.perl.org/File/Find.html для получения дополнительной информации, особенно stat один, если вы хотите сравнить другие атрибуты файла.

Если файлы не существуют в каталоге2, но существуют в каталоге1, также будет вывод, потому что stat будет иначе.

Найдите и стат:

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

Запустите это в обоих каталогах, затем сравните два файла со списком.

Спасает вас от зла ​​Perl ...

Вы уверены, что 2 папки должны быть рекурсивно одинаковыми? я думаю rsync Команда очень мощна для этого.

В вашем случае вы можете запустить:

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

Различные файлы или папки будут перечислены в качестве вывода команды.

Вы можете увидеть man rsync для более полного объяснения этих опций.

ls -al покажет разрешения, если они оба находятся в одной папке, вы получите что-то вроде этого:

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

3-й столбец - владелец, 4-й - группа.

Если два каталога имеют одинаковую структуру и у вас есть tree установлен, вы можете различать каталоги, выполнив:

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)