разрешение файла в директории - PullRequest
0 голосов
/ 07 марта 2011

Как мне найти файл, принадлежащий пользователю tree и группу, принадлежащую tree?И как я могу найти целый каталог, внутри которого файлы принадлежат tree?

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

Модуль File :: Find является стандартным модулем Perl (т. Е. Он доступен во всех установках Perl).Вы можете использовать File :: Find, чтобы пройти по дереву каталогов и найти нужный файл.

Для использования вы создаете подпрограмму wanted, которая анализирует файлы, а затем подпрограмма find включаетэта wanted рутина в своем вызове.Модуль File::Find немного запутан, потому что изначально он предназначался только для команды find2perl .

Вот некоторый полностью непроверенный код.Обратите внимание, что вы делаете отвратительные вещи, такие как использование глобальных переменных и переменных пакета.Это одна из причин, по которой мне не нравится File::Find.

use File::Find;
our $myUid = getpwnam('tree');
our $muGid = getgrnam('tree');
find (\&wanted, @dirList);

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($File::Find::name);
    next if (not -f $File::Find::name);
    next if ($uid != $myUid);
    next if ($gid != $myGid);
    print qq(File "$File::Find::name" is owned by group 'tree' and user 'tree'\n);
}

Я написал свой собственный File::Find под названием File::OFind, потому что он более объектно-ориентированный.Вы можете получить это от здесь .Это немного легче понять.(Опять же, полностью не проверено):

use File::OFind;
# Really should test if these return something
my $myUid = getpwnam('tree');
my $muGid = getgrnam('tree');

# Create your directory search object
my $find = File::OFind->new(STAT => 1, $directory);

# Now keep looping and examining each file
while($find->Next) {
   next if ($find->Uid != $myUid);
   next if ($find->Gid != $myGid);
   next if ($find->Type ne "f");   #Is this a file?
   print $find->Name . " is owned by group and user tree\n";
}
0 голосов
/ 08 марта 2011

File :: Find :: Rule делает это простым и понятным:

use File::Find::Rule;

my $uid_tree = getpwnam('tree');
my $gid_tree = getgrnam('tree');

my @files =
   File::Find::Rule
   ->file()
   ->uid($uid_tree)
   ->gid($gid_tree)
   ->in('.');

Ref:

0 голосов
/ 07 марта 2011

Встроенные функции Perl, необходимые для выполнения этой задачи, включают getpwnam, getgrnam и stat.

 ($name,$passwd,$uid,$gid,
   $quota,$comment,$gcos,$dir,$shell,$expire) = getpwnam 'tree';

вернет много полезной информации о пользователе tree. Для этой задачи вас особенно заинтересует поле $uid. Точно так же,

($name,$passwd,$gid,$members) = getgrnam 'tree';

извлекает данные о группе tree. Вас больше всего заинтересует поле $gid. Наконец, функция stat

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
   $atime,$mtime,$ctime,$blksize,$blocks)
       = stat($filename);

возвращает 13-элементный массив с системной информацией о файле (или каталоге). Для вашей задачи вы ищете файлы, в которых идентификаторы пользователей и групп, возвращенные из stat($filename), соответствуют идентификаторам пользователей и групп, возвращенным из getpwnam и getgrnam.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...