2009-11-11 11 views
6

同じ拡張子を持つ複数の入力ファイルに対してPerlスクリプトを実行するにはどうすればよいですか?同じ拡張子を持つ複数の入力ファイルに対してPerlスクリプトを実行するにはどうすればよいですか?

perl scriptname.pl file.aspx 

私はそれが現在のディレクトリにあるすべてのaspxファイルに対して

感謝を実行持っていますよ!あなたのPerlファイルで

+0

がhttp://stackoverflow.com/questions/506009/を参照してください。ファイルを複数のファイルにスキャンする – daotoad

+0

出力をターミナルではなくファイルにエクスポートすることはできますか? –

答えて

7

my @files = <*.aspx>; 
for $file (@files) { 

     # do something. 

} 

<*.aspx>globと呼ばれています。

+0

これは機能しますが、ジョブを実行するシェルを持っていない(またはGUIランチャーを介してスクリプトが起動されている)場合にのみ必要です。 –

+0

ご意見ありがとうございます。しかし、質問を読んで、私はこの答えは資格を必要としないと思う。また、コマンドラインを使用するのではなく、プログラム自体の内部に ".aspx拡張子を持つすべてのファイルを取得する"ロジックを使用することをお勧めします。 –

+0

@Jonathan:OPが 'cmd'シェルを使ってWindows上で動作している可能性があります。私が知る限り、 'cmd'はUnixシェルのようにワイルドカード拡張を行いません。 –

1

Linuxマシンを使用している場合は、このようなものを試すことができます。

for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done 
+1

lsの役に立たない使用。 - for i in/tmp/* – ghostdog74

+0

実際には、質問に答えるには './*。aspx'でなければなりません。 –

+0

lsは、特定の順序でファイルを処理したい場合に非常に便利です。たとえば、ls -tr ./*.aspxは、変更された順にすべてのファイルに対してperlスクリプトを実行します。 – Ari

3

あなたは

$ perl myscript.pl *.aspx 
+3

Windowsの場合、@ARGVには「* .aspx」という項目が1つだけあります。 – n0rd

-2

また、あなたは持っているパスを渡すことができるコマンドライン上でスクリプト

foreach (@ARGV){ 
    print "file: $_\n"; 
    # open your file here... 
     #..do something 
    # close your file 
} 

にワイルドカード

とperlのこれらのファイルを渡すことができますaspxファイルを読み込んで1つずつ読み込みます。

#!/usr/bin/perl -w 

use strict; 

my $path = shift; 
my @files = split/\n/, `ls *.aspx`; 

foreach my $file (@files) { 
     do something... 
} 
+1

一部のシステムでは有効なコマンドではないlsにシェルする必要はありません。 –

+0

'ls'が利用可能なシステムでさえ、ここで使うのは間違ったツールであり、[複数のよく文書化された問題](http://mywiki.wooledge.org/ParsingLs)があります。 Perlには、単に 'my $ file(<*.aspx>)をforeachするか、コードのスケルトンとして、あなたのニーズがいくらかもっと複雑であれば、' opendir'というディレクトリにファイルをループして 'next// \を実行しないでください。aspx $/'をループ内の最上部に配置します。 – tripleee

2

globを明示的に使用して、シェルの動作に大きく依存することなくシェルパラメータを使用できます。

for my $file (map {glob($_)} @ARGV) { 
    print $file, "\n"; 
}; 

あなたは拡大し、複数のパラメータを使用して重複したファイル名の可能性を制御する必要があるかもしれません。 -nまたは-pとシンプルなワンライナーのために

0

、あなたが

perl -i~ -pe 's/foo/bar/' *.aspx 

をしたい-i~は、代わりに各ターゲットファイルを変更し、~接尾辞でバックアップをファイルに追加して、元のままにすると言います名。 (バックアップを残さないように接尾辞を省略しますが、まだ学習や実験を行っているなら、それは良い考えではありません;バックアップが完了したら削除することは、何かを台無しにしてバックアップから元のファイルを復元するよりもずっと面倒です。 )

あなたのPerlコードはワンライナー(または再利用できるように十分なだけの便利のためにあまりにも複雑である場合)、明らかにscriptname.pl-e '# your code here'を交換...それはファイル名の引数のリストを受け入れるように多分scriptname.plをリファクタリングものの、現在のディレクトリにある*.aspxすべてのファイルに対して実行するには、単にscriptname.pl *.aspxを使用してください。

ディレクトリ構造を再帰的に処理し、特定の名前パターンを持つすべてのファイルを検索する必要がある場合は、findユーティリティが便利です。

find . -name '*.aspx' -exec perl -pi~ -e 's/foo/bar/' {} + 

それが遅くなると(あなたの代わりにすべてのファイルを処理するために可能な限り少数の見つけファイルごとに1つ)を複数のプロセスを起動しますけれども、あなたのfind-exec ... \;-exec ... +試みをサポートしていない場合。ディレクトリだけのスペース区切りのリストで(その名カレントディレクトリ).を置き換える検討、あるいはディレクトリに自分自身を見つけるためにfindを使用します(その後、おそらくに何かをするため-execdirを探るために、いくつかのディレクトリをスキャンするために

findが複雑で複雑な、ビジネスクリティカルな、おそらく秘密リストのfindオプション述語で選択する各ディレクトリ)。

find2perlを参照して、このディレクトリ再帰をネイティブにPerlで行うこともできます。 Linuxではperl scriptname.pl *.aspx *.asp

を処理するために、例えば

0

:perlが単にWindowsのようにperlで各引数でワイルドカードを展開するワイルドカードを展開しない

for (@ARGV) { 
    operation($_); # do something with each file 
} 

ことができるので、シェルは、ワイルドカードを展開します続く。 forループその後、例えば

for (map {glob} @ARGV) { 
    operation($_); # do something with each file 
} 

上記と同様に各ファイルを処理し、これはWindowsの

の下で展開されたリストを出力します
print "$_\n" for(map {glob} @ARGV); 
関連する問題