在 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 天修改过的文件(可能增加这个以防万一)
-exec
对 find
的所有匹配项执行以下命令
-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
命令将代价高昂。将 find
与 xargs
结合起来会更有效,以将单独的 grep
命令的数量减少到最少:
find / -type f -mtime -2 -print0 |
xargs -r0 grep -Fnw 'search string'
xargs
将从其标准输入中读取的文件名分组,以形成以给定单词开头的 grep
命令的参数列表,从而大大减少单独的 grep
命令。
另请注意:
- 示例命令使用 GNU
find
和 GNU xargs
提供的扩展。从示例命令中删除两个 0
s 可以解决这个问题,但会让您面临涉及包含换行符的文件名的问题。
- 如图所示,
-F
选项将使 grep
对于您描述的情况(搜索词是固定字符串)稍微更有效。如果搜索词包含任何正则表达式元字符,它还会保护您免受搜索词被误解的可能性。
find
可以使用各种附加信息来更好地选择将哪些文件传递给 grep
,如果您可以收集任何此类详细信息。例如,如果您可以确定哪个用户将拥有该文件,或者有关其模式(权限)的任何信息,或者文件大小的下限或上限。此外,如果您可以将搜索限制在小于整个文件系统的范围内,那么当然也会缩短经过的时间。
- 对于一个大的文件系统,不管你做什么,只是遍历所有的文件,甚至不读取它们的任何内容都需要相当长的时间。
我试图在我正在处理的服务器中查找包含特定字符串的文件。我试过 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 天修改过的文件(可能增加这个以防万一)-exec
对find
的所有匹配项执行以下命令
-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
命令将代价高昂。将 find
与 xargs
结合起来会更有效,以将单独的 grep
命令的数量减少到最少:
find / -type f -mtime -2 -print0 |
xargs -r0 grep -Fnw 'search string'
xargs
将从其标准输入中读取的文件名分组,以形成以给定单词开头的 grep
命令的参数列表,从而大大减少单独的 grep
命令。
另请注意:
- 示例命令使用 GNU
find
和 GNUxargs
提供的扩展。从示例命令中删除两个0
s 可以解决这个问题,但会让您面临涉及包含换行符的文件名的问题。 - 如图所示,
-F
选项将使grep
对于您描述的情况(搜索词是固定字符串)稍微更有效。如果搜索词包含任何正则表达式元字符,它还会保护您免受搜索词被误解的可能性。 find
可以使用各种附加信息来更好地选择将哪些文件传递给grep
,如果您可以收集任何此类详细信息。例如,如果您可以确定哪个用户将拥有该文件,或者有关其模式(权限)的任何信息,或者文件大小的下限或上限。此外,如果您可以将搜索限制在小于整个文件系统的范围内,那么当然也会缩短经过的时间。- 对于一个大的文件系统,不管你做什么,只是遍历所有的文件,甚至不读取它们的任何内容都需要相当长的时间。