我想用perl计算文件夹内的文件数。使用以下代码我可以列出它们,但我不知道如何在perl中计算它们。有什么帮助吗?
$dir = "/home/Enric/gfs-0.5.2016061400";
opendir(DIR, "$dir");
@FILES = grep { /gfs./ } readdir(DIR);
foreach $file (@FILES) {
print $file, "\n";
}
closedir(DIR);
答案 0 :(得分:7)
如果您只想计算它们,一旦打开了一个目录供您阅读,您可以在context上操作readdir,以便它返回所有条目的列表,然后将其分配给标量。这为您提供了列表的长度,即。元素数量
opendir my $dh, $dir;
my $num_entries = () = readdir($dh);
构造= () =
名称为 goatse operator ,请参阅it in perlsecret。当然,有更明确的方法,如下所示。
如果您想计算某些类型的文件,请先通过grep传递文件列表,就像您一样。由于grep
在其输入readdir
上强加了列表上下文,因此返回所有文件的列表,并在过滤grep
后返回一个列表。当您将其分配给标量时,您将获得列表的长度(元素数量),即。你的数量。例如,对于所有常规文件和/gfs./
文件
use warnings;
use strict;
my $dir = '/home/Enric/gfs-0.5.2016061400';
opendir my $dh, $dir or die "Can't open $dir: $!";
my $num_files = grep { -f "$dir/$_" } readdir($dh);
rewinddir($dh); # so that it can read the dir again
my $num_gfs = grep { /gfs./ } readdir($dh);
(这只是一个例子,使用rewinddir
以便它可以正常工作。要真正从目录中获取两种文件,最好将所有文件读入一个数组,然后处理它)
请注意readdir
返回裸文件名,没有任何路径。因此,对于大多数通常用文件完成的操作,我们需要在路径前加上它(除非你先{{ 1}}到那个目录)。这是在上面chdir
块中执行的操作,以便grep
file test (-X)具有正确的文件名。
如果您需要使用文件列表本身,请将其转换为数组,然后将其分配给标量
-f
此处map为每个文件构建完整路径。如果您不需要路径删除# Get the file list, then its length
my @files_gfs = map { "$dir/$_" } grep { /gfs./ } readdir($dh);
my $num_gfs = @files_gfs;
。请注意,通常不需要在数组上正式使用scalar来获取计数,例如
map { }
相反,只需将数组指定给标量,它就是一个成语(至少可以说)。
如果您在阅读时处理文件,请按照计算
my $num_gfs = scalar @files_gfs; # no need for "scalar" here!
此处my $cnt_gfs = 0;
while (my $filename = readdir($dh)) {
$cnt_gfs++ if $filename =~ /gfs./;
# Process $dir/$filename as needed
}
位于标量上下文中(因为其输出被分配给标量),并且它遍历目录条目,一次返回一个。
请注意。在上面的所有代码中,我使用问题readdir
中的示例 - 但如果这实际上意味着表示文字句点,则应将其替换为/gfs./
答案 1 :(得分:4)
您拥有@FILES
中的文件列表。所以你的问题就变成了“如何获得数组的长度?”这很简单,您只需在标量上下文中评估数组。
my $number_of_files = @FILES;
print $number_of_files;
或者您可以使用scalar()
函数消除不必要的标量变量。
print scalar @FILES;
答案 2 :(得分:1)
尝试使用此代码作为初学者(这是在Windows上,将包括.
,..
和文件夹。如果您只想要文件,可以过滤掉这些代码):
#!/usr/bin/perl -w
my $dirname = "C:/Perl_Code";
my $filecnt = 0;
opendir (DIR, $dirname) || die "Error while opening dir $dirname: $!\n";
while(my $filename = readdir(DIR)){
print("$filename\n");
$filecnt++;
}
closedir(DIR);
print "Files in $dirname : $filecnt\n";
exit;
答案 3 :(得分:1)
我知道这不是Perl,但是如果你需要一个快速的方法,只需在bash命令行中输入:
ls -1 | wc -l
ls -1
为您提供目录中的文件列表,wc -l
为您提供行数。结合使用,它们会为您提供目录中的文件数量。
或者,您可以使用Perl调用bash(尽管您可能不应该使用
)system("ls -1 | wc -l");