大文字と小文字を区別せずに複数のファイル拡張子を繰り返す方法は?

大文字と小文字を区別せずに複数のファイル拡張子を繰り返す方法は?

複数のファイル拡張子を繰り返す方法に関するさまざまなトピックを見ましたが、ほとんどの場合、リストは定義されています。

例:

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

noclaseglobbash2.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 {} +

おすすめ記事