検索 - 分離によるワイルドカード

検索 - 分離によるワイルドカード

私は以前にディレクトリツリーから.hファイルと.cファイルを検索し、そのファイルに対してclang-formatを実行するスクリプトを作成しました。

find $directory -name '*.[hc]' -exec clang-format -i {} \;

これは期待どおりに機能します。それでは、検索に.cppファイルを追加したいと思います。しかし、両方

-name '*.{[hc],cpp}'

...でもない

-name '{*.[hc],*.cpp}'

働くつまり、文書が見つかりませんでした。

findのオプションを使用すると、-oロジックが機能できることがわかります。ただし、-name単一のコマンドでこれを行う方法が必要です。

ベストアンサー1

-name述語で使用されるパターンは、find標準ファイル名のワイルドカードパターンです。findサポートされていない中括弧拡張を使用しようとしています。

ないことを参考にしてください一つ.cまたはで終わるファイル名と一致する.h標準ワイルドカードパターン.cpp

、、、 '*.'{c,h,cpp}およびで拡張されているが述語やを含まないものなどを使用できます。*.c*.h*.cpp-name-o

次に試してみますが、'-o -name "*.'{c,h,cpp}'"'これは3つの文字列-o -name "*.c" -o -name "*.h"と拡張されます-o -name "*.cpp"find個々の部分文字列を識別するにはスペースに分割し、-o最初の部分文字列から削除する必要があるため、この方法は機能しません。うまくいくかもしれませんが、それほどeval価値があるよりも問題が多いようです。

代わりに、次のものを使用できます。二つ -nameテストするには、途中でORを使用してください。

find  "$directory" -type f \( -name '*.[ch]' -o -name '*.cpp' \) \
    -exec clang-format -i {} +

これは-name、前述の2つのテスト(-oOR演算子)を使用し、clang-format見つかったパス名を各ファイルに対して一度呼び出すのではなく、一括してツールに渡すことによって呼び出しの数を最小限に抑えます。

いくつかの追加のプログラミングにより、リストから選択したいすべてのファイル名のサフィックスを保存し、findそこから目的の表現を作成できます。

どのシェルを使用しているのか言及していないので、shPOSIXシェルに対してこれを行っています。

set -- c h cpp

for suffix do
    set -- "$@" -o -name "*.$suffix"
    shift
done

shift # shifts off the initial "-o"

find "$directory" -type f \( "$@" \) -exec clang-format -i {} +

または

set --
for suffix in c h cpp; do
    set -- "$@" -o -name "*.$suffix"
done

shift

find "$directory" -type f \( "$@" \) -exec clang-format -i {} +

この例の拡張リスト"$@"は次のとおりです。

-name '*.c' -o -name '*.h' -o -name '*.cpp'

おすすめ記事