その拡張子のないすべてのファイルに対して実行

その拡張子のないすべてのファイルに対して実行

ファイルにそのファイルがない場合にプログラムを見つけて実行する方法は?

サンプルファイル:

/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様シェルで利用できます。

おすすめ記事