gpt4 book ai didi

perl - 使用 Perl 计算文件夹中的文件数

转载 作者:行者123 更新时间:2023-12-04 16:27:01 31 4
gpt4 key购买 nike

我想用 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);

最佳答案

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

opendir my $dh, $dir;
my $num_entries = () = readdir($dh);
构造 = () = 将列表上下文强加于 readdir 并将(该表达式†)分配给一个标量,从而获得该列表中的元素数量。‡ § 参见 it in perlsecret 。另见 this page
当然,还有更清晰的方法,如下所示。
如果您想对某些类型的文件进行计数,请像您一样首先通过 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 返回裸文件名,没有任何路径。因此,对于通常对文件完成的大部分工作,我们需要在它前面加上路径(除非您首先将 chdir 放到该目录中)。这是在上面的 grep 块中所做的,以便 -f file test (-X) 具有正确的文件名。
如果您需要使用文件列表本身,请将其放入一个数组中,然后将其分配给一个标量
# Get the file list, then its length
my @files_gfs = map { "$dir/$_" } grep { /gfs./ } readdir($dh);
my $num_gfs = @files_gfs;
这里 map 为每个文件构建完整路径。如果您不需要路径,请删除 map { } 。请注意,通常不需要在数组上正式使用 scalar 来获取计数,例如
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./ -- 但如果这实际上意味着表示文字句点,则应将其替换为 /gfs\./
  • 所有这些关于 readdir 如何返回裸文件名(无路径)的讨论都不需要 glob (或更好的 File::Glob ),它确实返回完整路径
    use File::Glob ':bsd_glob';  # (better with this)

    my @files = glob "$dir/*";
    这将返回路径为 $dir/filename 的文件列表。
    并不是说 opendir + readdir 有什么问题。只是不要忘记路径。
    另一种选择是使用库,例如​​ Path::Tiny 及其 children 方法。

  • † 赋值 () = readdir $dh 本身也返回一个值,在这种情况下,整个表达式(赋值)被放置在标量上下文中。
    ‡ 问题在于,Perl 中的许多功能依赖于它们的操作和上下文返回,因此人们不能总是仅仅将列表分配给标量并期望获得列表的长度。 readdir 是一个很好的例子,它返回列表上下文中所有条目的列表,但返回标量上下文中的单个条目。
    § 这是它的另一个技巧
    my $num_entries = @{ [ readdir $dh ] };
    这里是匿名数组(引用)的构造函数 [] ,它将列表上下文强加给 readdir ,而解引用 @{ } 不关心上下文,只返回该数组引用的元素列表。所以我们可以将它分配给一个标量,这样 scalar assignment 返回该列表中的元素数。

    关于perl - 使用 Perl 计算文件夹中的文件数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37821571/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com