1

Perldirで、ループで読み取り、取得するために実行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("$filename\n");
    }
}
closedir(DIR);
4

2 に答える 2

7

完全なファイルパスをstat()関数に渡す必要があります。現時点ではファイル名を渡すだけなので、スクリプトは現在のディレクトリでこのファイルを探します。

言い換えれば、これを行います:

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
         $atime,$mtime,$ctime,$blksize,$blocks) = stat("$dirname/$filename");
于 2011-04-11T08:57:01.547 に答える
0

他の人が述べているように、問題は$dirname、ファイル名のみでファイルを操作しようとしていることです(readdirドキュメントによる)。フルパスstatがないと、ファイルを見つけることができません。

ディレクトリを各ファイル名に連結し、結果を絶対的なものにすることもできますが(他の回答に対する私のコメントを参照)、これは首の痛みです。

のファイルを操作するもう1つの方法$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("$filename\n");
        }
    }

}

ブロック後、元のcwd状態に戻ります。注:この場合、このコードはテストしていません。私はこの方法をよく使います。それは問題を解決するはずです、そしてそれはポータブルです!

于 2011-04-11T15:08:25.897 に答える