以前投稿された質問に加えて sh で find を使用する - コマンドが機能しない
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
このコマンドは、「archive」または「chmod」テキストが複数行に見つかった場合、ファイルを見つけることができませんでした。ただし、「chmod」と「archive」テキストが同じ行に見つかった場合は、ファイルをスキャンできます。
このコマンドを試してみましたが、目的のo/pが得られませんでした
1> find . -type f -name '*FW*' -exec grep -iEq 'chmod.*' {} \; -ls -exec grep -iEq '.*archive.*' {} +
このコマンドではなぜ目的の o/p が得られないのでしょうか?
このコマンドを試したところ、期待通りの結果が出ましたが、「find: 'pcregrep' はシグナル 11 によって終了しました」というエラーで断続的に失敗しました。
2> find . -type f -name '*FW*' -exec pcregrep -qM 'chmod.*(\n|.)*archive.*' {} \; -ls
なぜエラーで失敗するのでしょうか?
答え1
質問の2番目のコマンドは、使用するテストの順序が重要であるため、正しい出力を出力しません。他のコマンドが実行されるためfind
、コマンドは文字列を含むファイルの結果のみを出力します。chmod
grep
後 -ls
(出力は生成されません)。
chmod
文字列との両方を含むファイルを検索しますarchive
。
find . -type f -name '*FW*' \
-exec grep -Fiq chmod {} \; \
-exec grep -Fiq archive {} \; -ls
これは、名前にgrep -Fiq chmod
が含まれるすべてのファイルを呼び出しFW
、次にgrep -Fiq archive
最初にgrep
一致が見つかったファイルを呼び出します。2 番目grep
でも何かが見つかった場合は、 が-ls
有効になります。