find -execのパイプコマンド?

find -execのパイプコマンド?

.txtすべてのファイルを見つけ、特定の文字列を検索したいとします。私はそれをします:

find ./ -type f -name "*.txt" -exec egrep -iH 'something' '{}' \;

次のようなより複雑なフィルタリングを実行するには、次の手順を実行します。

egrep something file.txt | egrep somethingelse | egrep other

内部で-execを探しますか? (または類似)

必要に応じて簡単に入力できるソリューションを探していることに注意してください。私はシェルスクリプトを使って数行でこれを行うことができることを知っていますが、それは私が望むものではありません。

答え1

findでこれを行う必要がある場合は、シェルを呼び出す必要があります。

find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh {} \;

他の選択肢としては、次のものを使用できますxargs

find ./ -type f -name "*.txt" | 
    xargs -I{} grep -EiH something {} | 
        grep -EiH somethingelse | 
            grep -EiH other

または、任意のファイル名を使用する方が安全です(findサポートしていると仮定-print0)。

find ./ -type f -name "*.txt" -print0 | 
    xargs -0 grep -EiH something {} | 
        grep -Ei somethingelse | 
            grep -Ei other

あるいは、シェルループを使用することもできます。

find ./ -type f -name "*.txt" -print0 | 
    while IFS= read -d '' file; do 
        grep -Ei something "$file" | 
            grep -Ei somethingelse | 
                grep -Ei other
    done

答え2

編集:この答えは好まないしかし、bashスクリプトの潜在的に危険なトラップを比較して説明するためにここに残しました。


bash次のコマンドで(または他のシェル)を提供できます-exec

find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "{}" | egrep somethingelse | egrep other' \;

これの欠点の1つは、コマンドがより複雑になると参照問題がより重複する可能性があることです。これを防ぐために、forループに分割することができます。

for i in $(find -type -f -name "*.txt"); do
  if egrep -iH something "$i" | egrep somethingelse | egrep other; then 
    echo "Found something: $i"
  fi
done

関連情報