用于计算windows目录树中文件数的perl脚本

用于计算windows目录树中文件数的perl脚本,perl,Perl,我不熟悉perl脚本。我正在尝试获取目录和子目录的计数。 因此,我搜索了所有关于脚本的可用帮助。 但无法获取子目录的计数。下面是我使用的脚本 use strict; use warnings; use File::Slurp; my @dirs = ('.'); my $directory_count = 0; my $file_count = 0; my $outfile = 'log.txt'; open my $fh, '>', $

我不熟悉perl脚本。我正在尝试获取目录和子目录的计数。 因此,我搜索了所有关于脚本的可用帮助。 但无法获取子目录的计数。下面是我使用的脚本

use strict;
use warnings;
use File::Slurp;

my @dirs            = ('.');
my $directory_count = 0;
my $file_count      = 0;
my $outfile         = 'log.txt';

open my $fh, '>', $outfile or die "can't create logfile; $!";
for my $dir (@dirs) {
    for my $file (read_dir ($dir)) {
        if ( -d "$dir/$file" ) {
            $directory_count++;
        }
        else {
            $file_count++;
        }
    }
    print $fh "Directories: $directory_count\n";
    print $fh "Files: $file_count\n";
}
close $fh;
在这里,我无法确定在何处使用/s更改dir命令。 请帮助,这将减少大量的体力劳动

Ravi

使用起来似乎更简单。。例如:

use warnings;
use strict;
use File::Find::Rule;

my @files = File::Find::Rule->new->file->in('.');
my @dirs = File::Find::Rule->new->directory->in('.');

永远不要编写自己的目录遍历。陷阱、陷阱和边缘案例太多了。例如路径分隔符、带空格的文件、备用数据流、软链接、硬链接、DFS路径。。。不要这样做

使用
File::Find
或者如果您更喜欢
File::Find::Rule

由于我更喜欢前者,我将举一个例子:

use strict;
use warnings;

use File::Find;

my $dir_count;
my $file_count;

#find runs this for every file in it's traversal.
#$_ is 'current file'. $File::Find::Name is full path to file. 
sub count_stuff {
    if ( -d ) { $dir_count++ };
    if ( -f ) { $file_count++ };
}

find ( \&count_stuff, "." );

print "Dirs: $dir_count\n";
print "Files: $file_count\n";

下面是一个脚本:1)没有全局变量;2)而不向名称空间添加另一个子对象

#!/usr/bin/env perl

use strict;
use warnings;
use File::Find;

run(\@ARGV);

sub run {
    my $argv = shift;
    for my $dir ( @$argv ) {
        my $ret = count_files_and_directories( $dir );
        printf(
            "%s: %d files and %d directories\n",
            $dir,
            $ret->{files},
            $ret->{directories}
        );
    }
    return;
}

sub count_files_and_directories {
    my $top = shift;
    my %ret = (directories => 0, files => 0);
    find(
        {
            wanted => sub {
                -d and $ret{directories} += 1;
                -f and $ret{files} += 1;
            },
            no_chdir => 1,
        },
        $top,
    );
    \%ret;
}

用一个包含很多文件的目录试试看。如果OP只需要计数,他就不需要收集数十万个字符串到一个数组中。@SinanÜnür如果用户只需要检查少量文件,这个解决方案就足够有效,并且解决了他的问题。OP没有指定文件和目录的数量,所以我们不知道。当然,您的解决方案是选择大计数。