heaq
* .mdファイルで単語を含むすべての行を見つけようとします。
$ for i in $(find . -regex ".*md$"); do grep -i "heaq"; done
#pending
#pending
しかし、まだ解決されていない状態です。
私のコードに何の問題がありますか?
答え1
これはgrep
「未定」です。grep
実行時に読み取るファイル名がない場合は、標準入力を読み込みます。標準入力にデータを提供しない場合は「停止」と表示されます。
また、出力を繰り返しますfind
。これはエレガントではなく(すべてのパス名が見つかるまでループは実行されませんfind
)、危険です(パス名がスペースに分割され、シェルがファイル名のグロービングを実行します)。
grep
代わりに、特定のファイル名サフィックスを持つすべてのファイルに対して実行するには、次の手順を実行します。
find . -type f -name '*.md' -exec grep -iF 'heaq' {} +
私はこれをパターンがファイル名サフィックスを持つファイル名とのみ一致する-regex
標準テストに変更しました。また、通常のファイルでのみ実行するのが合理的であるため、これを追加しました(ディレクトリ以外のファイルで実行するように変更したい場合があります)。-name
.md
-type f
grep
-type f
! -type d
見つかったパス名を一括して実行しますgrep
。正規表現ではなく文字列を一致させるため、withを-exec
使用します。部分文字列以外の単語を一致させるには、追加する必要があります。-F
grep
-w
関連:
答え2
ファイル名を次に渡す必要があります。grep
とても好き
$ for i in $(find . -regex ".*md$"); do grep -i "heaq" $i; done
また、使用することができます
% grep -i -n "heaq" $(find . -regex ".*md$")
-n
grepが一致する行番号を印刷するようにします。