ファイルにそのファイルがない場合にプログラムを見つけて実行する方法は?
サンプルファイル:
/file1.c
/file1.h
/file2.c
/file3.c
/file3.hpp
/file4.c/unrelated.txt
find / -type f -name '*.c' -exec my_program_here {} \;
実行日:
/file1.c
/file2.c
/file3.c
しかし、そのファイルを含むファイルをフィルタリングしたいと思います.h
。最後に、my_program_here
以下で実行する必要があります。
/file2.c
/file3.c
私*.h
存在するすべての結果をどのようにフィルタリングできますか?
ベストアンサー1
ラッパーを直接実行するのではなく、sh
ラッパーを実行してみてください。my_program_here
たとえば、
find . -type f -name '*.c' -exec \
sh -c '[ ! -e "${1%c}h" ] && my_program_here "$1"' find-sh {} \;
または(shを一度フォークし、一致するすべての.cファイルを繰り返します):
find . -type f -name '*.c' -exec sh -c \
'for f; do
[ ! -e "${f%c}h" ] && my_program_here "$f"
done' find-sh {} +
これは、シェルの引数拡張された%
「一致するサフィックスの削除」機能を使用して、現在処理中の.cファイルに一致する.hファイルがあることを確認します。存在しない場合は、ファイル名を引数として my_program_here を実行します。
~からhttps://pubs.opengroup.org/onlinepubs/007908775/xcu/chap2.html
${parameter%word}
最小サフィックスパターンを削除します。単語が拡張され、パターンが生成されます。パラメータ拡張は、サフィックスの最小部分が削除されたパターンと一致するパラメータを生成します。
この機能は、bash、ksh、およびその他のposix準拠のbourne様シェルで利用できます。