如何使用Perl的mkdir创建具有“正确”权限的目录?

时间:2010-10-30 06:23:35

标签: perl directory mkdir

我需要这个程序的帮助。作为我项目的一部分,我需要 创建一个目录。我正在使用系统功能来执行此操作,但是 后来被告知Perl有一个名为mkdir的内置函数。

我在Ubuntu 10.04上。问题是mkdir似乎无法按需运行。

它创建目录但权限不同。这里 是我创建目录的函数:

sub createDir {
       my ($dir,$perm) = @_;
       unless(-d $dir) {
               mkdir $dir,$perm or die "$!";
       }
}

我在程序的很多部分称它为:

createDir('.today','0755');

目录.today被创建,但问题是权限, 它没有0755权限。

我做错了什么?

我的Perl详细信息是:

$perl -v

This is perl, v5.8.8 built for x86_64-linux-thread-multi

3 个答案:

答案 0 :(得分:10)

您将权限作为 字符串 传递。 mkdir期望它为 数字 。但是字符串中的八进制数字被解释为 十进制 。因此,'0755'被解释为十进制755,并由mkdir使用。

要解决此问题,您可以调用子例程传递数字权限:

createDir('.today',0755);

或者,您可以使用oct函数将八进制字符串转换为数字值。

子程序调用保持不变:

createDir('.today','0755');

但其定义更改为使用oct函数:

mkdir $dir,oct($perm) or die "$!";

答案 1 :(得分:3)

mkdir的第二个参数不是创建模式。它是一个掩码,&~umask一起确定创建模式。如果您指定参数0755并且您的umask是027,那么0755 &~ 0027 == 0750。确保将所有内容保持为八进制,十进制。

通过use POSIX qw[ :sys_stat_h ]可以获得这些内容的常量,例如S_IRWXUS_IWGRPS_ISVTX,但这些常数可能比它们值得更多

答案 2 :(得分:3)

修复codeaddict的字符串与数字问题并注意tchrist的umask问题后,如果需要特定权限,则应在创建新目录后调用chmod。

我通常在没有掩码的情况下调用mkdir,然后将目录chmod到我想要的权限。

从shell中检查这些:

$ perldoc -f mkdir
$ perldoc -f chmod
$ perldoc -f unmask

您也可以在调用mkdir之前将umask设置为零,如果您需要以原子方式创建具有正确权限的目录,则需要以这种方式执行此操作。这样的事情可能就是你想要的:

sub createDir {
        my ($dir, $perm) = @_;
        if(!-d $dir) {
                my $old = umask(0);
                mkdir($dir, $perm) or die "$!";
                umask($old);
        }
        else {
                chmod($dir, $perm);
        }
}