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

おすすめ記事