拡張子を持つすべてのファイルを見つけようとします。.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
ファイル名が印刷されます。