
パターン を持つファイルを検索しようとしていますFW
。これらのフィルタリングされたファイルから、パターン を検索しchmod.*archive|archive.*chmod
、それらをリストします。
以下のコマンドを試しましたが、期待した出力が得られませんでした。この問題を解決するには助けが必要です。
find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more
答え1
私の理解が正しければ、必要なのは以下のとおりです。
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
これgrep
により、 が見つけた各ファイルでパターンが検索されfind
、 がgrep
成功した場合は、 に似た形式でファイルがリストされますls -l
。
答え2
@terdon が提案した方法の代わりに、次のコマンドを使用することもできます。
grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW
編集
@Kusalananda が指摘したように:
名前に FW が含まれるディレクトリにあるファイルに一致するものがある場合、これは失敗します (間違った出力が生成されます)。
適切に動作するように調整すると、読みにくくなります。@terdon が提案した解決策は、より好ましい選択肢です (より効率的です - @tedron のコメントを参照してください)。
ただし、修正版は次のとおりです。
grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'
答え3
パターンに一致する行を持つファイルに対応するパス名を取得するには、次の 2 つのオプションがあります。
find
パス名を出力してみましょう:find . -name '*FW*' -type f \ -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
これは
grep
見つかった各ファイルに対して個別に実行され、パターンに一致する各ファイルのパス名を出力します (ちなみに、回答の他のすべては標準的であったため、私はこれを 2 つの個別の基本正規表現の標準準拠セットに変換しました)。これは、ターミナルにパス名を印刷する以外に、パス名に対して何か他の操作を実行したい場合に使用します (
-exec
アクションを追加するだけです)。grep
パス名を出力してみましょう:find . -name '*FW*' -type f \ -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
これは、
grep
見つかったファイルのバッチで実行されます。ユーティリティは、(「ダッシュ-エル」) オプションがgrep
指定されている場合、一致する各ファイルのパス名を報告します。-l
これは、実行される呼び出しの数を最小限に抑えるため
grep
、より速く実行される可能性があり、単に見てパス名で。