代码之家  ›  专栏  ›  技术社区  ›  Dr. Watson

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

  •  2
  • Dr. Watson  · 技术社区  · 16 年前

    我有一个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 回复  |  直到 16 年前
        1
  •  3
  •   cjm    16 年前

    stat 失败时返回空列表,该列表将所有这些变量设置为UNdef。添加 or die $! 打电话后要找出失败的原因:

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

    一旦你知道了失败的原因,你就可以找到解决方法了。如果没有,则将错误消息添加到您的问题中。

        2
  •  1
  •   Dummy00001    16 年前

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

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

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

        3
  •  1
  •   Hasturkun    16 年前

    您还可以使用 -o

        4
  •  0
  •   ysth    16 年前

    stat dirhandle是一个相当新的特性,如果我记得每个平台上都没有可用的stat dirhandle,您确定您的Perl支持它吗?

    您可能希望首先集中精力让stat expr为您工作。