Определите владельца группы / пользователя для каталога - PullRequest
2 голосов
/ 23 августа 2010

У меня есть Perl-скрипт, который будет выполнять некоторые операции с каталогами, и я только жду его запуска на каталогах, владельцем которых является текущий пользователь (например, пользователь, выполняющий скрипт).

У меня естьпопробовал следующее:

...
my $user = getlogin();
opendir(HANDLE, $path) or die ("No such directory: $path");
foreach my $directory (readdir HANDLE)
{
    opendir(WORKING_DIR_HANDLE, "$path/$directory") or die ("!!!!!!!");
    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(WORKING_DIR_HANDLE);
    my $owner = getpwuid($uid);
    if( $owner eq $user )
    {
      ...
    }
}
...

Код работает по большей части.Однако вызов stat () возвращает неопределенные значения.В соответствии с документацией по Perl, я думаю, что я правильно выполняю вызов stat ():

* stat FILEHANDLE
* stat EXPR
* stat DIRHANDLE
* stat

 Returns a 13-element list giving the status info for a file, either the file opened via
 FILEHANDLE or DIRHANDLE, or named by EXPR. If EXPR is omitted, it stats $_ . Returns the 
 empty list if stat fails. Typically used as follows:

Я также попытался просто вставить EXPR, используя имя файла, и я получил те же результаты.Я что-то упускаю из виду?Или есть другой способ сделать это?Я бы предпочел решение, которое не требует установки сторонних модулей Perl.

Ответы [ 4 ]

3 голосов
/ 23 августа 2010

stat возвращает пустой список при ошибке, который устанавливает все эти переменные в undef. Добавьте or die $! после звонка, чтобы узнать, почему это не удалось:

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
   = stat(WORKING_DIR_HANDLE) or die $!;

Как только вы поймете, почему это не удалось, вы сможете выяснить, как это исправить. Если нет, то добавьте сообщение об ошибке в свой вопрос.

1 голос
/ 23 августа 2010

Вы также можете проверить, принадлежит ли файл / каталог текущему пользователю, используя -o

1 голос
/ 23 августа 2010

Попробуйте добавить обработку ошибок, например после stat:

if ($!) {
   warn "WRN: $path/$directory: $!";
   next;
}

Если запуск сценария занимает много времени, некоторые каталоги (и файлы) могут быть перемещены / удалены пользователями (или фоновыми заданиями).

0 голосов
/ 23 августа 2010

stat DIRHANDLE - довольно новая функция, и если я правильно помню, она недоступна на каждой платформе ... вы уверены, что ваш Perl поддерживает ее?

Вы можете сосредоточиться на том, чтобы сначала настроить stat EXPR на вас.

...