如何在当前目录中输出空文件的名称?

时间:2013-08-06 19:41:06

标签: perl filesize glob

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

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

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

5 个答案:

答案 0 :(得分: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}

答案 1 :(得分:1)

#!/usr/bin/perl

use strict; use warnings;

foreach my $file (glob('*')) {
    unless (-s $file) {
        print "$file\n";
    }
}

答案 2 :(得分:1)

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

在我看来,编码“如果文件长度为零”而不是“除非文件的长度非零”

更清晰

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

 #/run/my/perl

 use strict;
 use warnings;
 foreach my $file ( glob("*") ) {
   print "$file\n" if -z $file;
 }

答案 3 :(得分: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

答案 4 :(得分:-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