パターンのあるファイルを検索しようとしています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
( "dash-ell")オプションに基づいて一致する各ファイルのパス名を報告します。-l
grep
必要に応じてコール数を最小限に抑えるので、おそらくより速く実行されます。バラよりパス名に。