在 linux 最近修改的文件中查找包含字符串的文件

Find files containing string among recently modified files in linux

我试图在我正在处理的服务器中查找包含特定字符串的文件。我试过 grep -rnw 但服务器很大,可能需要几天才能完成。 我不知道该文件的位置,也不知道它是如何命名的。唯一知道的是几乎每天都在修改(具体时间和频率不知道有没有)。

一种方法是列出过去2天内修改过的所有系统文件,并对这些文件应用grep搜索,但我不知道如何实现。

尝试使用:

find / -mtime 0 -exec grep "some string" "{}" \;

您确实可以使用 find 来过滤最近修改的文件,并且只对这些文件进行 grep:

find / -type f -mtime -2 -exec grep -H -n "your search query" '{}' \;

  • -type f 只匹配常规文件
  • -mtime -2 匹配最近 2 天修改过的文件(可能增加这个以防万一)
  • -execfind
  • 的所有匹配项执行以下命令
  • -H 告诉 grep 在匹配行旁边打印文件名
  • -n 打印匹配的行号
find ./ -mtime -2 -exec grep "ABC" {} /dev/null \; -ls

一些解释:

  • -mtime -2 : 取最近两天修改过的文件(你可以随意修改值
  • grep "ABC": 你要找的字符串
  • -exec do_something {} \; :这是使用您的搜索结果执行“do_something”的方式(称为 {}
  • -ls :将此添加到您的 find 命令可提供有关您找到的文件的完整信息。这个可以省略

到目前为止,您的其他答案都建议使用 find-exec 功能来 运行 对每个已识别的候选文件执行 grep 命令。这是可行的,但启动成百上千个单独的 grep 命令将代价高昂。将 findxargs 结合起来会更有效,以将单独的 grep 命令的数量减少到最少:

find / -type f -mtime -2 -print0 |
  xargs -r0 grep -Fnw 'search string'

xargs 将从其标准输入中读取的文件名分组,以形成以给定单词开头的 grep 命令的参数列表,从而大大减少单独的 grep 命令。

另请注意:

  • 示例命令使用 GNU find 和 GNU xargs 提供的扩展。从示例命令中删除两个 0s 可以解决这个问题,但会让您面临涉及包含换行符的文件名的问题。
  • 如图所示,-F 选项将使 grep 对于您描述的情况(搜索词是固定字符串)稍微更有效。如果搜索词包含任何正则表达式元字符,它还会保护您免受搜索词被误解的可能性。
  • find 可以使用各种附加信息来更好地选择将哪些文件传递给 grep,如果您可以收集任何此类详细信息。例如,如果您可以确定哪个用户将拥有该文件,或者有关其模式(权限)的任何信息,或者文件大小的下限或上限。此外,如果您可以将搜索限制在小于整个文件系统的范围内,那么当然也会缩短经过的时间。
  • 对于一个大的文件系统,不管你做什么,只是遍历所有的文件,甚至不读取它们的任何内容都需要相当长的时间。