Bashでは、ファイル名に対して複数の条件を持つ正規表現とどのように一致しますか? たとえば、.txtまたは.logエンディングのすべてのファイルと照合したいと思います。ファイル名の一致の正規表現
私は基準の1つのタイプと一致する方法を知っている:
for file in *.log
do
echo "${file}"
done
何論理の構文ですか基準の2種類以上を一致させるために?
Bashでは、ファイル名に対して複数の条件を持つ正規表現とどのように一致しますか? たとえば、.txtまたは.logエンディングのすべてのファイルと照合したいと思います。ファイル名の一致の正規表現
私は基準の1つのタイプと一致する方法を知っている:
for file in *.log
do
echo "${file}"
done
何論理の構文ですか基準の2種類以上を一致させるために?
ls
と同じ方法で実行します。あなたは、複数のワイルドカードを1つずつ指定することができます。
for file in *.log *.txt
for file in *.{log,txt} ..
あなたは単に最後に、他の条件を追加します。
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
だからあなたの場合:
for file in *.log *.txt
do
echo "${file}"
done
を
Bashは、正規表現をサポートしていないため、globbing(filena私はマッチングする)。しかし、そのグロブシンタックスは非常に汎用性があります。たとえば:
for i in A*B.{log,txt,r[a-z][0-9],c*} Z[0-5].c; do
...
done
はAで始まり、ドットと次の拡張子のいずれか、その後、Bで終わるすべてのファイルのループの内容が適用されます:
また、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
また、これを行うことができます。
簡単に多くの選択肢に拡張することができshopt -s extglob
for file in *.+(log|txt)
:
for file in *.+(log|txt|mp3|gif|foo)
大抵はうまくいきますが、奇妙なことは、.txtファイルがない場合、「.txt」がエコーされることです。 – Mike
@showoptビルドを使用してnullglobシェルオプションを設定する必要があります。これを避けるには – thkala
ありがとう@thkala! – Mike