我正在尝试检查我的文件夹中是否为空(0字节)的文件。我有大约1200个文件,因此Perl将使这项任务变得非常简单:)
到目前为止,这是我的代码,但它似乎不起作用。 (它只列出了所有文件。)任何人都可以教我做错了什么吗?谢谢!
#!/usr/bin/perl
@files = glob('*');
if ((-s @files) == 0) {
print"@files\n";
}
答案 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