我正在尝试检查我的文件夹中是否有空文件(0 字节)。我有大约 1,200 个文件,因此 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
返回。undef
$!{ENOENT}
#!/usr/bin/perl
use strict; use warnings;
foreach my $file (glob('*')) {
unless (-s $file) {
print "$file\n";
}
}
我推荐一个与所有其他解决方案非常相似的解决方案,但我建议您使用 -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
要查看在搜索当前目录下的所有级别时它是如何完成的,请考虑标准工具的输出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。