特定の行に特定の文字列が含まれていないファイルのリスト

特定の行に特定の文字列が含まれていないファイルのリスト

拡張子を持つすべてのファイルを見つけようとします。.md

find . -type f -name "*.md"

次に、2行目(行番号= 2)で、次から始めて終わる正確な文字列を含まないファイルをフィルタリングしたいと思います。author: Mr. Xab Ycd

2番目の部分はどうすればいいですか?grepファイル全体をスキャンするため、非効率的です。

ベストアンサー1

find . -type f -name '*.md' -exec \
  sh -c 'sed 1d\;q "$1" | grep -qvx "author: Mr. Xab Ycd"' sh {} \; -print

上記のコマンドには、シェルを介して混乱を招く可能性があるファイル名をパイプする必要なく、すべての要件が含まれています。

最初の部分は(ほぼ)あなたのものからコピーされました。というファイルを探します*.md。あなたの場合は、二重引用符を「ハード」一重引用符に変更しましたが、名前付きファイルを見つけるには*.$md二重引用符を使用してください。 、変数を拡張しようとします$md

一致するファイル名は別のテストに合格します-exec。 execの引数は、.txtにある特定のファイル名の成功または失敗を決定する小さなシェルスクリプトです$1。このsedコマンドは、2 行目だけを印刷します。これを行う方法はさまざまです。たとえば、次のようになります。

  • sed -n '2{p;q;}'または
  • sed '1d;q

1つ目は、「デフォルトでは行は印刷されませんが、2行目が表示されたら印刷してから終了します」と言います。 2番目は、「デフォルトでは行を印刷しますが、最初の行を削除してから(2行目で)終了することを意味します。このqコマンドは、終了する前に現在のバッファを印刷します。

テキスト行(存在する場合)はgrepに渡され、行全体が指定されたテキストと一致する(または一致しない)ことを確認します。もしそうならいいえ一致(-v)すると、コマンド全体が成功し、findファイル名が印刷されます。

おすすめ記事