
返される結果に「警告:」または「エラー:」テキストを含むファイルのみが含まれるように、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 stat
whileループからそれを削除すると、すべてが機能します。単純なものに置き換えると、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
。複数のファイルから呼び出すことができるため、現在のディレクトリからそのような名前に拡張されないようにパターンを引用します。-l
while
stat
-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
両方のパターンの一致を含む各ファイルに対して一度呼び出されるため、効率がわずかに低下します。
答え2
GNUのgrep(1)は再帰的なパターンマッチングを行うことができます:
grep -R warning that-dir
以下のすべてのファイルを確認してくださいthat-dir
。