ディレクトリ内のすべてのファイルをPerlスクリプトにパラメータとして渡します。

ディレクトリ内のすべてのファイルをPerlスクリプトにパラメータとして渡します。

私は50個のファイルがあるディレクトリを持っており、次の名前の間に空白のみを使用して、これらすべてのファイルを同時にPerlスクリプトに渡したいと思います。

./perl_script.pl file1 file2 file3 .. file50

これらのファイルにはすべて数値ではなく名前があります。

ループ内で一度にすべてのファイルをPerlスクリプトに渡す方法を理解していますが、すべてのファイルを一度に渡すのに問題があります。

ベストアンサー1

あなたが探している機能はシェルによって処理されます。知られているパス名拡張。たとえば、file1 file2 file3 .. file50ファイルが含まれているディレクトリにあるとします。次に始まるディレクトリ内のすべてのファイルを指定できますfile

./perl_script.pl file*

シェルの場合、*文字をゼロに設定または移動することを意味します。シェルは、fileゼロ文字以上の名前で始まり、次のすべてのファイルを検索します。また、現在のディレクトリのすべてのファイルを指定するには、次の手順を実行します。

./perl_script.pl *

別のディレクトリー内のすべてのファイルを指定するには、次のようにします。

./perl_script.pl /some/other/dir/*

これはPerl機能ではなくシェル機能です。シェルはパス名拡張を実行します。今後パラメータリストはPerlに渡されます。したがって、すべてのシェルコマンドで動作します。実際にPerlスクリプトを実行せずにパス名拡張をテストするには、echoを使用します。

echo /some/other/dir/*

これにより、Perlスクリプトで見られるのと同じパス名拡張結果が表示されます。

特別な場合

デフォルトでは、パターンに一致するファイルがない場合は、パターン自体が返されます。

$ echo *bash*
*bash*

bashこの動作は、以下とオプションを使用して変更できます。nullglobglobfail

また、ピリオドで始まる名前のファイルは、デフォルトではパス名拡張には含まれません。ただし、ピリオドで始まるパターンを指定すると、そのパターンが含まれます。

$ echo .*bash*
.bash_history .bash_logout .bash_profile .bashrc

その他の機能

それ以外にも、ある文字を代表する*特殊文字があります。?したがって、file?file10の代わりにfile1に展開されます。

文字グループも指定できます。したがって、file[123]ファイルが存在すると仮定すると、file1、file2、file3ファイルは拡張されますが、file4は拡張されません。名前は1つの数字のみで構成されるすべてのファイルfile[[:digit:]]に拡張されます。file

Bashなどの高度なシェルには、より多くのオプションがあります。の「パス名拡張」でこれを読んでくださいman bash

おすすめ記事