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

时间:2016-06-14 20:32:11

标签: 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);

4 个答案:

答案 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");