2

空 (0 バイト) のファイルがないかフォルダーを確認しようとしています。私は約1,200個のファイルを持っているので、Perlはこのタスクを非常に簡単にします:)

これまでのコードは次のとおりですが、機能していないようです。(すべてのファイルをリストしているだけです。)誰かが私が間違ったことを教えてもらえますか? ありがとう!

#!/usr/bin/perl
@files = glob('*');
if ((-s @files) == 0) {
    print"@files\n";
}
4

5 に答える 5

5

1 つのチェックを行いますが、複数のファイルがあります。明らかに、それは意味がありません。各ファイルをチェックするループを追加する必要があります。

#!/usr/bin/perl
use strict;
use warnings;
my @files = grep { -s $_ == 0 } glob('*');
   # or:    grep { ! -s $_ }
   # or:    grep { -z $_ }
   # or:    grep { -z }
   # or:    grep -z,
print "@files\n";

あなたのバージョンでは、名前の付いたファイルのサイズ12または要素の数を取得しようとしています@files。結果、セット-sで返っundefてきまし$!{ENOENT}た。

于 2013-08-06T19:46:09.253 に答える
1
#!/usr/bin/perl

use strict; use warnings;

foreach my $file (glob('*')) {
    unless (-s $file) {
        print "$file\n";
    }
}
于 2013-08-06T19:44:27.870 に答える
1

perl で物事を行うもう 1 つの方法

use File::stat;   
foreach (glob('*')){ 
   print stat($_)->size,"\n"
};     

# this will file sizes of all files and directories 
# you need to check if its a file and if size is zero
于 2013-08-06T20:06:57.803 に答える
-2

現在のディレクトリの下のすべてのレベルを検索するときにそれがどのように行われるかを確認するには、標準ツールの出力を検討してfind2perlください。

$ find2perl . -type f -size 0c
#! /usr/bin/perl -w
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if 0; #$running_under_some_shell

use strict;
use File::Find ();

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;

# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '.');
exit;

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _ &&
    (int(-s _) == 0)
    && print("$name\n");
}

上記のコードを実行します

$ find2perl . -type f -size 0c | perl

この知識を状況に適応させる

my @files = grep -f $_ && -s _ == 0, glob "*";
print @files, "\n";

または with への 1 回の呼び出しprint

print +(grep -f $_ && -z _, <*>), "\n";

_最新の結果のキャッシュされたコピーを保持する特別なファイルハンドルを使用するstatと、1 つで十分なオペレーティング システムに 2 つのトラップを作成することを回避できます。ファイルがプレーン ファイル ( -f) であることを確認する追加のチェックが必要であることに注意してください。これは、ゼロ サイズ チェック (-s _ == 0または-z _) が一部のファイル システムの空のディレクトリに対して true を返すためです。

于 2013-08-06T19:48:26.243 に答える