ファイルに一致が含まれている各フォルダで Grep を実行し、コマンドを実行します。

ファイルに一致が含まれている各フォルダで Grep を実行し、コマンドを実行します。

私はgrepがファイル内の一致するものを見つけるために各フォルダからコマンドを実行するエレガントな方法を探しています。findフラグは、-execdirコンテンツではなくフォルダ/ファイル名のみを検索することを除いて、findと非常によく似ています。

現在私は次のようなものを使用しています。

grep -r "pattern" --include=\*.out -l | xargs -L 1 bash -c 'cd `dirname "$0"` && some_script.sh'

より直接的な方法はありますか?それはまるでgrep ... -execdir

ベストアンサー1

find実行することができますgrep

find . -type f -name '*.out' \
    -exec grep -q -e 'pattern' {} \; \
    -execdir somescript.sh \;

見つかったパス名ごとに、パターンがファイルの行と一致することを確認するために.out使用されます。grepその場合は、見つかったファイルのディレクトリを作業ディレクトリとして使用して実行-execdirします。somescript.sh

somescript.shこれが機能するには、どこかで利用できる必要があり、スクリプトは一致するファイルを含む各ディレクトリ$PATHに対して1回ではなく、見つかった各ファイルに対して1回実行されます.out

.out一致するファイルを含む各ディレクトリでスクリプトを一度だけ実行します。

find . -type d -exec sh -c '
    for dirpath do
        if grep -q -e "pattern" "$dirpath"/*.out 2>/dev/null; then
            ( cd "$dirpath" && exec somescript.sh )
        fi
    done' sh {} +

findファイルではなくディレクトリを検索するために使用されます。バッチディレクトリが見つかると、短いインラインシェルスクリプトが実行されます。シェルスクリプトは、各ディレクトリ内のすべてのファイル(隠しディレクトリを探している間に隠しファイルを除く.out)に対してパターンを一致させようとします。一致するファイルがある場合は、作業ディレクトリが変更されるサブシェルを起動してスクリプトを実行します。findsomescript.sh

おすすめ記事