find execとwhileループの接続

find execとwhileループの接続

返される結果に「警告:」または「エラー:」テキストを含むファイルのみが含まれるように、findコマンドをスタックしようとしています。また、特定の形式の結果が必要なので、exec statこれを使用しています。

-exec stat動作するバージョンを取得できますが、whileループでそれを使用して特定の文字列を定式化できる必要があります。これにより、-exec statシェルにメッセージが表示されます>。機能しない部分は、下に太字で表示されています。

私はこれらを個別に動作させることができます。一緒にできません。

私が作業している作業の例は次のとおりです。

find . -type f -exec grep -li error: {} \; | while read -r file; do ls -l "$file"; done

それでは、ファイルを特定の時間、種類などに制限する他のプロセスでそれを解決したいと思います。うまくいきませんでした:

/my/directory/here/ が見つかりました。 -type f -name *.log -mmin -480 -mmin +60 -exec grep -li 警告: {} \ -exec grep -li エラー: {} \;|-r ファイルを読み取るとき -exec stat -c "$file" '%n|%y|%x|%s|%U|%u' {} \;完了

-exec statwhileループからそれを削除すると、すべてが機能します。単純なものに置き換えると、ls -l結果が私に返されます。今シェルは私にコマンドプロンプトを提供します。

私が正しくやっていないことは分かりますが、何を先に直すべきか今は分かりません。

ベストアンサー1

find /my/directory/here/ -type f -name '*.log' -mmin -480 -mmin +60 \
    -exec grep -qi warning: {} \; \
    -exec grep -qi error: {} \; \
    -exec stat -c '%n|%y|%x|%s|%U|%u' {} +

つまり、両方のgrepコマンドの実際の出力を必要とせず、終了状態のみを必要とするため、ループは不要です-q。複数のファイルから呼び出すことができるため、現在のディレクトリからそのような名前に拡張されないようにパターンを引用します。-lwhilestat-exec stat ... {} +*.log

関連:

同じタスクを実行する別の方法:

find /my/directory/here/ -type f -name '*.log' -mmin -480 -mmin +60 \
    -exec sh -c '
        for pathname do
            if grep -qi warning: "$pathname" &&
               grep -qi error: "$pathname"
            then
                stat -c "%n|%y|%x|%s|%U|%u" "$pathname"
            fi
        done' sh {} +

これは、サブシェル内で実行されるループのfindパス名ジェネレータとして使用されます。forただし、これはstat両方のパターンの一致を含む各ファイルに対して一度呼び出されるため、効率がわずかに低下します。

おすすめ記事