私は以前にディレクトリツリーから.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つのテスト(-o
OR演算子)を使用し、clang-format
見つかったパス名を各ファイルに対して一度呼び出すのではなく、一括してツールに渡すことによって呼び出しの数を最小限に抑えます。
いくつかの追加のプログラミングにより、リストから選択したいすべてのファイル名のサフィックスを保存し、find
そこから目的の表現を作成できます。
どのシェルを使用しているのか言及していないので、sh
POSIXシェルに対してこれを行っています。
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'