一致するTODOを含み、1週間未満のファイルを見つけます。

一致するTODOを含み、1週間未満のファイルを見つけます。

私の失敗した提案

find ./ -newerct '1 week ago' -print | grep TODO

出力が必要ですが、出力はありません。

ファイルは次のテキストファイルです。

Lorem
% TODO check this out
Lorem ipsun

TODOに一致する1週間未満のファイルを見つける方法は? 出力はTODOの次の行でなければなりません。 Perlソリューションは私も練習していて人気があります。

答え1

これを変更してください:

find ./ -newerct '1 week ago' -print | grep TODO

これに関して:

find ./ -newerct '1 week ago' -exec grep TODO {} +

またはこれ:

find ./ -newerct '1 week ago' -print | xargs grep TODO

説明する

grep出力findを検索するファイルのリストとして解釈するのではなく、入力として解釈します。つまり、grep一致しようとします。TODO名前ファイルの代わりにコンテンツ

grep(1)マニュアルページから:

grepは名前付き入力ファイルを検索します(ファイル名が指定されていない場合、または単一のハイフンマイナス記号(-)がファイル名として指定されている場合は、標準入力が検索されます)。

次の行を一致させるにはTODO:

find ./ -newerct '1 week ago' -exec grep -A1 TODO {} + | grep -v TODO

これはGNUがあると仮定しますgrep

答え2

あなたはそれを使用することができます:

find ./ -type f -newerct '1 week ago' -exec sh -c "grep -H -A1 TODO {} | tail -1" \;

説明する:

  • -type f:検索パターンにファイルのみを含める
  • -exec sh -c "...":検索されたすべてのファイルに対して実行...
  • grep -H -A1 TODO {} | tail -1-Hファイル名を印刷し、-A1一致する行を印刷し、tail -1出力から最初の行(TODOを含む行)を削除します。

答え3

この試み

find . -type f -ctime -7 -print | grep -R "TODO" /etc/

-type f - ファイルのみをリストするには、fと入力してください。

-ctime -7作成されてから7日間が経過していないファイルに適用されます。

関連情報