sh で find を使用する - コマンドが機能しない

sh で find を使用する - コマンドが機能しない

パターン を持つファイルを検索しようとしています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 つのオプションがあります。

  1. findパス名を出力してみましょう:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    これはgrep見つかった各ファイルに対して個別に実行され、パターンに一致する各ファイルのパス名を出力します (ちなみに、回答の他のすべては標準的であったため、私はこれを 2 つの個別の基本正規表現の標準準拠セットに変換しました)。

    これは、ターミナルにパス名を印刷する以外に、パス名に対して何か他の操作を実行したい場合に使用します (-execアクションを追加するだけです)。

  2. grepパス名を出力してみましょう:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    これは、grep見つかったファイルのバッチで実行されます。ユーティリティは、(「ダッシュ-エル」) オプションがgrep指定されている場合、一致する各ファイルのパス名を報告します。-l

    これは、実行される呼び出しの数を最小限に抑えるためgrep、より速く実行される可能性があり、単に見てパス名で。

関連情報