Perl 如何在当前目录中输出空文件的名称?
我正在尝试检查文件夹中是否有空文件(0字节)。我有大约1200个文件,因此Perl将使这项任务变得非常简单:) 这是到目前为止我的代码,但它似乎不起作用。(只是列出了所有的文件。)谁能教我做错了什么?谢谢Perl 如何在当前目录中输出空文件的名称?,perl,filesize,glob,Perl,Filesize,Glob,我正在尝试检查文件夹中是否有空文件(0字节)。我有大约1200个文件,因此Perl将使这项任务变得非常简单:) 这是到目前为止我的代码,但它似乎不起作用。(只是列出了所有的文件。)谁能教我做错了什么?谢谢 #!/usr/bin/perl @files = glob('*'); if ((-s @files) == 0) { print"@files\n"; } 你做了一次检查,但你有多个文件。显然,这毫无意义。您需要添加一个循环来检查每个文件 #!/usr/bin/perl use s
#!/usr/bin/perl
@files = glob('*');
if ((-s @files) == 0) {
print"@files\n";
}
你做了一次检查,但你有多个文件。显然,这毫无意义。您需要添加一个循环来检查每个文件
#!/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
返回了unde
和$!{eNo.}//Cuth.SET.看看当在当前目录下搜索所有级别时如何进行,考虑标准工具的输出。
使用以下命令运行上面的代码
$ find2perl . -type f -size 0c | perl
使这些知识适应您的情况
my @files = grep -f $_ && -s _ == 0, glob "*";
print @files, "\n";
或者在一次调用print
中使用
print +(grep -f $_ && -z _, <*>), "\n";
print+(grep-f$&&z,),“\n”;
使用保存最新统计结果的缓存副本的特殊文件句柄,可以避免在操作系统中设置两个陷阱,其中一个就足够了。请注意额外检查文件是否为普通文件(-f
),这是必要的,因为对于某些文件系统上的空目录,零大小检查-s\u==0
或-z
-将返回true。我推荐一种与所有其他解决方案类似的解决方案,但我建议您使用-z运算符而不是-s运算符
在我看来,编写“如果文件长度为零”代码比编写“除非文件长度为非零”代码更为清晰
两者具有相同的布尔意义,但前者更清楚地表达了您的意图。否则,你得到的答案都很好
#/run/my/perl
use strict;
use warnings;
foreach my $file ( glob("*") ) {
print "$file\n" if -z $file;
}
在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
我运行了这个,但它也不起作用/:没有打印任何内容,但我知道事实上有一些文件存在,因为我已经手工找到了。啊!我将代码改为(括号),代码运行正常!sputnik考虑的是,而()
OP没有递归搜索,因此您需要添加-maxdepth 1
#/run/my/perl
use strict;
use warnings;
foreach my $file ( glob("*") ) {
print "$file\n" if -z $file;
}
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