2011-01-12 13 views
1

は現在、私はこれをやっている:perlでアルファベット順にソートされたすべてのサブディレクトリのすべてのhtmlファイルのリストを取得するには?

# Find all files 
File::Find::find(
    sub { 
     my $file = $_; 
     return if -d $file; 
     return if $file !~ /(.*)\.htm$/; 

     ...my processing code 

    }, $inputdir 
); 

しかし、私はアルファベット順にすべてのファイルを処理したい、最終的に私は、アレイ内のすべてのファイル名を格納配列をソートし、各ループのために使用したいです私の処理コードをそこに置くが、私はそれをどうやって行うのか完全に突っ込んでいる。

私は多くのグーグルでやったことがありますが、他のすべてのものと同じように、すべてを行う方法は100種類ありますが、それらのどれも私が望むすべてのことを終わらせることはできません。 html、特定のディレクトリ内のすべてのサブディレクトリ、そのディレクトリ構造ではなく、ファイル名に基づいてアルファベット順に並べ替えられます。

誰でもお手伝いできますか?私はこれがかなり簡単にできることを知っています、私はそれを理解できません。

感謝:)

編集:私はこれをやって試してみた:

File::Find::find(
    sub { 
     #Only process html files 
     my $file = $_; 
     return if -d $file; 
     return if $file !~ /(.*)\.htm$/; 

     push(@files, $File::Find::name); 

    }, $inputdir 
); 

しかし、私は配列は、それが文字列全体に基づいて、それをソートします@files並べ替える場合は、その後、私はしたいですファイル名に基づいてソートします。私はFile :: findでそれを行う方法はないと思う:すべてのファイルを走査するまでの順序を知る方法がないので、後で並べ替える必要がある。

答えて

2

あなたはFile::Basenameを使用することができます - のようなファイル名に基づいてファイルをソートするために、ディレクトリ、ファイル名と接尾辞とSchwartzian transformへのファイルパスを解析し、ファイルの

@files = map { $_->[0] } 
    sort { $a->[1] cmp $b->[1] } 
    map { [$_, fileparse($_, "\.html?")] } @files; 

fileparse()ルーチンは::ベース名は、にファイルパスを分割しますその$directories, $filename and (optionally) the filename $suffix.だからfilenameを取得し、それをソートするためSchwartzian transformに渡します。

0

もう一つの解決策は、最初にキャッシュにFile::Basenameと場所結果からをファイル名を取得するようハッシュキャッシュ方法なり、その後、私たちすることができます、単にソートキャッシュされた値、すなわち。上、

my %cache; 
foreach my $file (@files){ 
    $cache{$file} = fileparse($file, "\.html?"); 
} 
@files = sort{$cache{$a} cmp $cache{$b}}@files; 
ができ
0

これはではなく、になりますが、File::Find::Ruleという優れた点を含むために含まれており、小さなファイルツリーであれば楽しく受け入れられるかもしれません。 Path::Classも使用します。

use warnings; 
use strict; 
use File::Find::Rule; 
use Path::Class qw(file); 

my @files = map { file($_) } 
    File::Find::Rule->file() 
    ->name("*\.html") 
    ->in(shift||"."); 

for my $file (sort { lc($a->basename) cmp lc($b->basename) } @files) 
{ 
    print $file, $/; 
} 
関連する問題