2016-06-14 7 views
1

perlでフォルダ内のファイル数をカウントしたいと思います。次のコードで私はそれらをリストアップすることができますが、私はperlで数える方法を知らない。どんな助け?perlを持つフォルダ内のファイル数をカウントする

$dir = "/home/Enric/gfs-0.5.2016061400"; 
opendir(DIR, "$dir"); 
@FILES = grep { /gfs./ } readdir(DIR); 
foreach $file (@FILES) { 
print $file, "\n"; 
} 
closedir(DIR); 
+2

を使用して、Perlの(おそらくないはずですが)からのbashを呼び出すことができます。警告を使う; 'トップへ。 '$#FILES'はファイル数をカウントする方法の1つですが、配列が0から始まるときには1を追加する必要があります – KeepCalmAndCarryOn

+1

[Perlで配列のサイズを見つける](http://stackoverflow.com/questions)/7406807/find-size-of-an-perlの配列) –

+3

このコードを自分で書いたのですか、それとも他の場所からコピーしましたか?私が尋ねる理由は、多くのことが間違っているからです。チュートリアルのサイトなどからコピーした場合は、将来そのサイトを避けることをおすすめします。 –

答えて

3

あなただけしたい場合はそれらを数えれば、ディレクトリを開いていればcontextreaddirで操作してすべてのエントリのリストを返し、それをスカラーに割り当てることができます。これはあなたにリストの長さを与えます。要素

opendir my $dh, $dir; 
my $num_entries =() = readdir($dh); 

構造=() =の数がgoatseオペレータの名の下に行く、it in perlsecretを参照してください。もちろん、以下のように、より明確な方法があります。

特定の種類のファイルを数えたい場合は、まずファイルリストをgrepまで渡します。 grepリストコンテキストをその入力に適用するので、readdirはすべてのファイルのリストを返し、フィルタリング後にgrep自身がリストを返します。それをスカラーに割り当てると、リストの長さ(要素の数)が得られます。あなたのカウント。たとえば、すべての通常のファイルとreaddirは、任意のパスなしで、裸のファイル名を返すこと/gfs./ファイル

use warnings; 
use strict; 

my $dir = '/home/Enric/gfs-0.5.2016061400'; 
opendir my $dh, $dir or die "Can't open $dir: $!"; 

my $num_files = grep { -f "$dir/$_" } readdir($dh); 
my $num_gfs = grep { /gfs./ } readdir($dh); 

注。ファイルで通常行われていることの大部分は、そのディレクトリに最初にchdirが付いていない限り、パスの先頭に追加する必要があります。上記のブロックgrepで行われているので、-ffile test (-X)に正しいファイル名があります。あなたはファイルリスト自体を使用する必要がある場合

は、配列にそれを取得し、スカラーここmap

# Get the file list, then its length 
my @files_gfs = map { "$dir/$_" } grep { /gfs./ } readdir($dh); 
my $num_gfs = @files_gfs; 

各ファイルの完全なパスを構築することを割り当てます。あなたがパスドロップを必要としない場合map { }。単に代わりにスカラーに配列を割り当てる

my $num_gfs = scalar @files_gfs; 

のように、通常のカウントを取得するには、アレイ上scalarの正式な使用のためには必要がないことに注意してください、それはイディオムです(控えめに言って)。

あなたが読んでいるあなたは、ファイルを処理している場合、あなたはreaddirここ

my $cnt_gfs = 0; 
while (my $filename = readdir($dh)) { 
    $cnt_gfs++ if $filename =~ /gfs./; 
    # Process $dir/$filename as needed 
} 

を行くように数える(その出力はスカラーに割り当てられているので)スカラーコンテキストであり、そしてそれは、ディレクトリを反復処理エントリは1度に1つ返されます。

0

(これはWindows上で、...とフォルダが含まれるファイルだけをしたい場合は、これらを除外することができます。)初心者のためのこのコードを試してみてください。

#!/usr/bin/perl -w 

my $dirname = "C:/Perl_Code"; 
my $filecnt = 0; 

opendir (DIR, $dirname) || die "Error while opening dir $dirname: $!\n"; 
while(my $filename = readdir(DIR)){ 
    print("$filename\n"); 
    $filecnt++; 
} 
closedir(DIR); 
print "Files in $dirname : $filecnt\n"; 
exit; 
4

ファイルリストは@FILESです。ですから、あなたの質問は「配列の長さをどうやって取得するのですか?」ということになります。それは単純ですが、スカラーコンテキストで配列を評価するだけです。

my $number_of_files = @FILES; 
print $number_of_files; 

それともscalar()機能を使用することにより、不要なスカラー変数を排除することができます。

print scalar @FILES; 
+0

コメントありがとうございました@Dave Cross –

0

私は、これはPerlではないですけど、あなたは簡単な方法が必要な場合は、ちょうどbashのコマンドラインに次のように入力します。

ls -1 | wc -l 

ls -1はあなたのファイルのリストを与えますディレクトリ、wc -lは行数を示します。結合すると、あなたのディレクトリにあるファイルの数が得られます。

また、あなたは厳格な使用 `追加Perlでいつものように

system("ls -1 | wc -l"); 
関連する問題