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、見つかった各ファイルのパターンに関するヘルプを提供しfindgrep成功した場合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( "dash-ell")オプションに基づいて一致する各ファイルのパス名を報告します。-l

    grep必要に応じてコール数を最小限に抑えるので、おそらくより速く実行されます。バラよりパス名に。

関連情報