我想在单个文件夹中创建某些XML文件集内容中提到的* .ini扩展名的所有文件名列表。 它们都包含完整路径,但我只需要 Filename.ini
基本上它意味着打开所有xml文件,读取它,找到带有* .ini ext的所有文件名并打印出来。
我正在考虑关注perl代码:
#!/usr/bin/perl
@files = <P:\TeamMembers\rsacek\_INI\*>;
foreach my $file (@fnames) {
chomp $file;
open my $fh, '<', $file or die $!;
while (<$fh>) {
push @files, /[">](.*\.ini)["<]/ig;
}
}
print "File names found: @files\n";
有什么想法吗?我有大约30k的文件要读。 谢谢!
答案 0 :(得分:1)
您应该在File::Find
中使用File::Find::Rule
或XML Parser
模块来处理所有混乱的递归。为什么重新发明轮子?
使用File::Find
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
my @found;
find(\&wanted, 'P:/TeamMembers/rsacek/_INI');
foreach ( @found ) {
print "$_\n";
}
sub wanted {
return unless -f;
open my $fh, '<', $File::Find::name or warn "failed $!" and return;
while (<$fh>) {
push @found, $1 if /[">](.*?\.ini)["<]/ig;
}
close $fh;
}
但也许对于另一种方法,这应该有用。
我对返回的非文件的项使用grep
(主要是列表过滤功能)。 map
用于获取完整路径,而不是继续循环并查找它。
#!/usr/bin/perl
use strict;
use warnings;
my $dir = 'P:/TeamMembers/rsacek/_INI';
opendir my $dh, $dir or die "failed opening '$dir' $!";
my @found;
foreach my $f ( map { "$dir/$_" } grep { -f "$dir/$_" } readdir $dh ) {
open my $fh, '<', $f or die "failed opening '$f' $!";
while ( <$fh> ) {
push @found, $1 if /[">](.*?\.ini)["<]/ig;
}
close $fh;
}
closedir $dh;
foreach ( @found ) {
print "$_\n";
}
答案 1 :(得分:1)
要获取文件名部分,可以使用“basename”。例如:
use File::Basename;
$album_name = basename($pwd);