我有一个包含数千个文件的目录 假设我有3个同名的pdf文件,如:
现在我想找到以" Sample"开头的具有特定名称的文件列表。
我目前正在使用:
#!/usr/bin/perl
use strict;
use warnings;
my $dir = '/home/gaurav/Desktop/CSP';
opendir( DIR, $dir ) or die $!;
while ( my $file = readdir(DIR) ) {
# We only want files
next unless ( -f "$dir/$file" );
# Use a regular expression to find files ending in .txt
next unless ( $file =~ /\.pdf$/ );
print "$file\n";
}
closedir(DIR);
exit 0;
答案 0 :(得分:3)
我建议readdir
而不是glob
你真正想要的是readdir
。后者以与shell相同的方式扩展模式,并返回匹配。它特别有用的原因是glob
返回文件名,其中#!/usr/bin/perl
use strict;
use warnings;
my $dir = '/home/gaurav/Desktop/CSP';
foreach my $file ( glob ( "$dir/sample*.pdf" ) ) {
print $file,"\n";
}
返回完整路径。 (例如目录)。
E.g。
next unless -f $file;
如果你想跳过任何'非文件',有两种方法:
foreach my $file ( grep { -f $_ } glob ( "$dir/sample*.pdf" ) ) {
或者:
.pdf
但这可能是一个没有实际意义的点,除非你的目录后缀为<?= ?>
,这有点不寻常。
答案 1 :(得分:2)
my $DirectoryName = '......';
chdir( $DirectoryName ) or die "Can't change directory: $!\n";
my @files = glob( "sample*");
for my $file (@files) {
print $file,"\n";
}
答案 2 :(得分:0)
这将提供以示例开头且扩展名为 .pdf 的所有文件名列表:
use warnings;
use strict;
opendir my $dir, "/home/gaurav/Desktop/CSP" or die "Can't open directory: $!";
my @files = grep { /sample.*\.pdf$/ } readdir $dir;
print "@files";
closedir $dir;
如果您想逐个打印文件名,请使用foreach
循环:
foreach my $file (@files)
{
print "$file\n";
}
答案 3 :(得分:0)
我会像下面那样做。
$file =~ /^sample.*\.pdf$/i
在这里&#39;我&#39;用于不区分大小写。它会搜索“样本”和“样本”。和&#39;示例&#39;。
while ( my $file = readdir(DIR) )
{
if((-f "$dir/$file" ) && ($file =~ /^sample.*\.pdf$/i))
{
print "$file \n";
}
}