私は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
)に対してパターンを一致させようとします。一致するファイルがある場合は、作業ディレクトリが変更されるサブシェルを起動してスクリプトを実行します。find
somescript.sh