2

我正在尝试检查我的文件夹中是否有空文件(0 字节)。我有大约 1,200 个文件,因此 Perl 将使这项任务变得非常容易 :)

到目前为止,这是我的代码,但它似乎不起作用。(它只是列出所有文件。)谁能教我我做错了什么?谢谢!

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

5 回答 5

5

你做了一个检查,但你有多个文件。显然,这没有任何意义。您需要添加一个循环来检查每个文件。

#!/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

我推荐一个与所有其他解决方案非常相似的解决方案,但我建议您使用 -z 运算符而不是 -s 运算符。

在我看来,编写“如果文件长度为零”而不是“除非文件长度不为零”更清楚

两者具有相同的布尔含义,但前者更清楚地编码您的意图。否则,你得到的答案都很好。

 #/run/my/perl

 use strict;
 use warnings;
 foreach my $file ( glob("*") ) {
   print "$file\n" if -z $file;
 }
于 2013-08-06T19:55:57.857 回答
1

在 perl 中做事的另一种方式

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";

或在一次调用print

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

_使用保存最新结果的缓存副本的特殊文件句柄stat可以避免在操作系统中造成两个陷阱,一个就足够了。请注意额外检查该文件是否为普通文件 ( -f),这是必要的,因为零大小检查(或-s _ == 0-z _)将对某些文件系统上的空目录返回 true。

于 2013-08-06T19:48:26.243 回答