2010-11-29 42 views
10

Bashでは、ファイル名に対して複数の条件を持つ正規表現とどのように一致しますか? たとえば、.txtまたは.logエンディングのすべてのファイルと照合したいと思います。ファイル名の一致の正規表現

私は基準の1つのタイプと一致する方法を知っている:

for file in *.log 
do 
     echo "${file}" 
done 

何論理の構文ですか基準の2種類以上を一致させるために?

答えて

14

lsと同じ方法で実行します。あなたは、複数のワイルドカードを1つずつ指定することができます。

for file in *.log *.txt 
+0

大抵はうまくいきますが、奇妙なことは、.txtファイルがない場合、「.txt」がエコーされることです。 – Mike

+2

@showoptビルドを使用してnullglobシェルオプションを設定する必要があります。これを避けるには – thkala

+0

ありがとう@thkala! – Mike

1
for f in $(find . -regex ".*\.log") 
do 
    echo $f 
end 
+3

これはファイル名の空白で壊れます... – thkala

+0

正規表現は、ディレクトリを含む完全なパスと照合されます。 – Albert

8
for file in *.{log,txt} .. 
3

あなたは単に最後に、他の条件を追加します。

for VARIABLE in 1 2 3 4 5 .. N 
do 
    command1 
    command2 
    commandN 
done 

だからあなたの場合:

for file in *.log *.txt 
do 
     echo "${file}" 
done 
17

Bashは、正規表現をサポートしていないため、globbing(filena私はマッチングする)。しかし、そのグロブシンタックスは非常に汎用性があります。たとえば:

for i in A*B.{log,txt,r[a-z][0-9],c*} Z[0-5].c; do 
... 
done 

はAで始まり、ドットと次の拡張子のいずれか、その後、Bで終わるすべてのファイルのループの内容が適用されます:

  • ログ
  • TXTほとんど何
続く一桁
  • Cに続く小文字に続い
  • R

    また、Zで始まるファイルにループコマンドを適用し、その後に0〜5の範囲の数字を続け、.c拡張子を付けます。

    あなたが本当にし/必要性が必要な場合は、shopt組み込みコマンドでグロブ拡張有効にすることができます。

    shopt -s extglob 
    

    などのサブパターン

    などのファイル名を、マッチングしながらかなり多くの機能を可能にサポートされる式の詳細については、bashのマニュアルを参照してください。

    http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching

    EDIT:

    式がファイル名と一致しない場合、デフォルトでbashは式自体を置き換えます(例:空の文字列ではなく* .txtをエコーし​​ます)。あなたはnullglobシェルオプションを設定することで、この動作を変更することができます

    shopt -s nullglob 
    

    これは、空の文字列と一致するファイルがありません* .txtが置き換えられます。

    EDIT 2:

    私はそれらのかなりの数は、ファイル名のパターンマッチングだけでなく、シェルの他の側面に影響を与えるので、あなたも、shopt組み込みとそのオプションをチェックアウトすることを示唆していますhttp://www.gnu.org/software/bash/manual/bash.html#The-Shopt-Builtin

  • 3

    また、これを行うことができます。

    簡単に多くの選択肢に拡張することができ
    shopt -s extglob 
    for file in *.+(log|txt) 
    

    for file in *.+(log|txt|mp3|gif|foo)