Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在当前目录中输出空文件的名称?_Perl_Filesize_Glob - Fatal编程技术网

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

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

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

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