确定目录的用户/组所有权

时间:2010-08-23 15:41:10

标签: perl file stat

我有一个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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

尝试添加一些错误处理,例如在stat之后:

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

如果您的脚本需要很长时间才能运行,那么用户(或后台作业)可能会移动/删除某些目录(和文件)。

答案 2 :(得分:1)

您还可以使用-o

测试当前用户是否拥有文件/目录

答案 3 :(得分:0)

stat DIRHANDLE是一个相当新的功能,如果我没记错在每个平台都没有...你确定你的perl支持吗?

您可能希望首先专注于让EXPR正在为您工作。