我的不成功的提议
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 天的文件