2009-02-16 11 views
4

Le script suivant stocke tous les fichiers et répertoires du tableau @file_list.Comment filtrer les noms de fichiers en fonction de leur extension?

Comment puis-je filtrer uniquement les fichiers avec l'extension .lt6 et rien d'autre que cela?

opendir (CURRDIR, $localdir); 
@file_list = grep !/^\.\.?$/, readdir CURRDIR; 
print STDOUT "Found Files: @file_list\n"; 

acclamations

Répondre

9

Essayez ceci:

grep(/\.lt6$/i, readdir(CURRDIR)) 

Je l'ai utilisé plusieurs fois. Cela fonctionne, bien que maintenant je préfère utiliser File::Next pour ce genre de chose.

Exemple:

use File::Next; 

my $iter = File::Next::files({ file_filter => sub { /\.lt6$/ } }, $localdir) 

while (defined (my $file = $iter->())) { 
    print $file, "\n"; 
} 
+0

réponses plutôt similaires - insensible à la casse vs non, et des parenthèses vs pas de parenthèses. : D –

+0

Et nous avons répondu à moins d'une minute les uns des autres. Les grands esprits se ressemblent 8D. Bien que dans ce cas je suppose que j'étais l'arme la plus rapide dans l'ouest! –

+0

Ouais - Je devrais savoir mieux que de modifier la question avant de donner une réponse: D –

3

N'oubliez pas closedir().

Votre grep devrait rechercher:

my(@file_list) = grep /\.lt6$/, readdir CURRDIR; 

En supposant que le reste de votre syntaxe est à peu près correcte.

1
opendir (CURRDIR, $localdir); 
@file_list = grep m/\.lt6$/, readdir CURRDIR; 
closedir CURRDIR; 
print STDOUT "Found Files: @file_list\n"; 
+0

Vous n'avez pas besoin de vérifier. et .. si vous ne faites que passer par des choses se terminant par .lt6. :) –

0

Et d'ajouter un peu de variété, vous pouvez aussi faire des choses comme ceci:

opendir(DIR, $path) || die qq([ERROR] Cannot opendir "$path" - $!\n); 
my(@txt) = grep(m{\.txt$}, readdir DIR); 
rewinddir DIR; 
my(@lt6) = grep(m{\.lt6$}, readdir DIR); 
rewinddir DIR; 
my(@dirs) = grep(-d "$path/$_", readdir DIR); 
closedir DIR; 

Et ainsi de suite.

2

Vous pouvez utiliser File::Find::Rule;

use File::Find::Rule; 

print "FOUND:\n " 
    , join("\n " 
      , File::Find::Rule->file->name('*.lt6')->in($path) 
     ) 
    , "\n" 
    ; 
+0

Cela a la caractéristique supplémentaire de la descente récursive. Si vous voulez seulement les fichiers dans le répertoire de premier niveau, c'est un gros canon à tirer pour aucun avantage supplémentaire. –

+0

Il est seulement aussi lourd que la portée de la liste des fichiers, qui n'est pas spécifié dans la description. Cela évite la structure procédurale open-loop-close, et je n'ai jamais aimé la syntaxe séparée pour opendir/closedir, de toute façon. Cela ne semblait guère être une amélioration par rapport à sh ($). – Axeman

2
my @file_list = glob "$localdir/*.lt6"; 
-1

Aller à l'invite de commande

cd \

dir/s * .lt6> mydir.txt