複数のファイル拡張子を繰り返す方法に関するさまざまなトピックを見ましたが、ほとんどの場合、リストは定義されています。
例:
for file in ${arg}/**/*.{txt,h,py}
do
....
done
ご覧のとおり、ファイル.TXT
は無視されます。残念ながら、この質問に答えた人はbash4でのみ機能すると言いました。しかし、私の設定ではbash3.xを使用します。
これを行う方法についてのアイデアはありますか?
ベストアンサー1
bash
ここで以下を設定できますnocaseglob
。
shopt -s nocaseglob
for file in "$arg"/**/*.{txt,h,py}
do
....
done
shopt -u nocaseglob
noclaseglob
bash
2.01以降はすべてのバージョンで動作しますが、4.0以降が**
必要です(そして修正された4.3bash
までシンボリックリンクに従います)。スペースやワイルドカードを含めると問題が発生するため、引用bash
符を変更する必要があります。$arg
使用せずに**
次のことができます。
find "$arg" \( -iname '*.txt' -o -iname '*.h' -o -iname '*.py' \) -exec bash -c '
for file; do
...
done' bash {} +
その後、探しているすべてのファイルを見つけて別の引数として新しいbashインスタンスに渡し、そのファイルを繰り返します。各ファイル操作が単一のコマンドの場合は、新しいbashインスタンスをスキップしてコマンドを直接使用できます。
修正する
以下のStephaneのコメントによると、POSIX準拠のソリューションは次のとおりです。
find "$arg" \( -name '*.[tT][xX][tT]' -o -name '*.[hH]' -o -name '*.[pP][yY]' \) \
-exec sh -c '
for file do
...
done' sh {} +