用perl计算文件夹中的文件数

Enr*_*que 4 perl

我想用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);
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 10

如果您只想计算它们,一旦打开一个目录进行读取,您就可以在readdir上操作上下文,以便返回所有条目的列表,然后将其分配给标量.这为您提供了列表的长度,即.元素的数量

opendir my $dh, $dir;
my $num_entries = () = readdir($dh);
Run Code Online (Sandbox Code Playgroud)

该构造= () =山羊运营商的名义命名,在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);
Run Code Online (Sandbox Code Playgroud)

(这只是一个例子,rewinddir因此它可以正常运行.要真正从目录中获取两种文件,请将所有文件更好地读入数组然后处理)

请注意,readdir返回裸文件名,没有任何路径.因此,对于通常使用文件完成的大多数操作,我们需要在路径前添加它(除非您首先chdir访问该目录).这是在grep上面的块中完成的操作,以便-f 文件测试(-X) 具有正确的文件名.

如果您需要使用文件列表本身,请将其转换为数组,然后将其分配给标量

# Get the file list, then its length
my @files_gfs = map { "$dir/$_" } grep { /gfs./ } readdir($dh);
my $num_gfs = @files_gfs;
Run Code Online (Sandbox Code Playgroud)

这里map构建了每个文件的完整路径.如果您不需要路径丢弃map { }.请注意,通常不需要在数组上正式使用标量来获取计数,例如

my $num_gfs = scalar @files_gfs;    # no need for "scalar" here!
Run Code Online (Sandbox Code Playgroud)

简单地将数组分配给标量,这是一个习惯用语(至少可以说).

如果您在阅读时处理文件,请随时计算

my $cnt_gfs = 0;
while (my $filename = readdir($dh)) {
    $cnt_gfs++ if $filename =~ /gfs./;
    # Process $dir/$filename as needed
}
Run Code Online (Sandbox Code Playgroud)

readdir是在标量上下文中(因为它的输出被分配给标量),它遍历目录条目,一次返回一个.


Dav*_*oss 6

您在中有文件列表@FILES。因此,您的问题变为“如何获取数组的长度?” 这很简单,您只需在标量上下文中评估数组即可。

my $number_of_files = @FILES;
print $number_of_files;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用scalar()函数消除不必要的标量变量。

print scalar @FILES;
Run Code Online (Sandbox Code Playgroud)