Сравнивая владельцев и прав доступа к контенту двух папок?

10

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

J.Olufsen
источник

Ответы:

11

Решение, как и во всем, представляет собой 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если вы хотите сравнить другие атрибуты файла.

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

CJC
источник
Если вы хотите, чтобы разрешение было напечатано в стиле UNIX, это пригодится:printf ("Permissions for %s and %s are not the same (%04o != %04o)\n", $file1, $file2, $mode1 &07777, $mode2 &07777) if ( $mode1 != $mode2);
Маркус
3

Найти и статистика:

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

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

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

Бен
источник
1
Тогда просто
отличайте
1

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

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

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

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

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

Билл Чжао
источник
использование src_dir / вместо src_dir в приведенной выше команде приведет к тому, что его содержимое будет просто отображаться на содержимое dst_dir)
Билл Чжао,
0

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-й - группа.

Лукас Кауфман
источник
Хм, а как насчет содержимого temp и temp2?
cjc
два способа: открыть 2 оболочки, перейти в обе папки и выполнить одну и ту же команду ls -al, или 1 оболочку с tmux, или просто перейти в одну папку, выполнить команду, перейти в другую и повторить ту же команду.
Лукас Кауфман
2
Это решение не будет масштабироваться.
Артем Руссаковский
0

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

diff <(tree -ap parent_dir_1) <(tree -ap parent_dir_2)
sk8asd123
источник