读取dir并获取每个文件的stat()



在Perl中,当我试图在循环中读取dir,并执行for each file stat()以获得$size$mode时,我得到了错误的数据!

例如,我刚刚创建了一个简单的文本文件,它显示我有权限0000,没有大小

Perl代码:

if (!@ARGV[0]) {
    die("Za mało parametrów!n");
}
$dirname = @ARGV[0];
opendir(DIR, $dirname) || die("Nie mogę otworzyć katalogu!n");
while( $filename = readdir(DIR) ) {
    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
         $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
    $perm = sprintf("%04o", $mode & 07777);
    $tmp1 = int(($size/1024));
    $tmp2 = length($filename);
    if (($tmp1 > $tmp2) && ($perm =~ /.[^5410]../)) {
        print("$filenamen");
    }
}
closedir(DIR);

您需要将完整的文件路径传递给stat()函数。此时,您只是传递一个文件名,因此脚本将在当前目录中查找该文件。

换句话说,这样做:

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

正如其他人所提到的,问题是您试图仅使用文件名操作$dirname中的文件(根据readdir文档)。如果没有完整路径,stat将无法找到该文件。

可以将目录连接到每个文件名,甚至可以使结果是绝对的(请参阅我对另一个答案的评论),但这是一个痛苦的脖子。

$dirname中的文件进行操作的另一种方法是将工作目录更改为有问题的目录,操作后返回到原始目录。我最喜欢的cd方式是File::chdir模块,它创建标量$CWD,它绑定到当前工作目录。这正是我所描述的,当它被local变成一个块并更改到您的目录时。然后你可以这样做:

use strict;
use warnings;
use File::chdir;
$dirname = shift @ARGV or die("Za mało parametrów!n") ;
{
    local $CWD = $dirname; #changes the cwd to contents of $dirname
    opendir(my $dir, $CWD) || die("Nie mogę otworzyć katalogu!n");
    while( $filename = readdir($dir) ) {
        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
             $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
        $perm = sprintf("%04o", $mode & 07777);
        $tmp1 = int(($size/1024));
        $tmp2 = length($filename);
        if (($tmp1 > $tmp2) && ($perm =~ /.[^5410]../)) {
            print("$filenamen");
        }
    }
}

block完成后,恢复原来的cwd。注意:我没有针对这种情况测试此代码。我经常使用这种方法。它应该可以解决这个问题,而且它是便携式的!

相关内容

  • 没有找到相关文章

最新更新