查找包含给定文本的文件

Posted

技术标签:

【中文标题】查找包含给定文本的文件【英文标题】:Find files containing a given text 【发布时间】:2011-09-03 10:24:43 【问题描述】:

在 bash 中,我想为每个 .php|.html|.js 类型的文件返回文件名(以及文件的路径),其中包含不区分大小写的字符串 "document.cookie" | "setcookie"

我该怎么做?

【问题讨论】:

你考虑过只使用 grep 吗? cyberciti.biz/faq/grep-in-bash 这个标题相当具有误导性。 “” 【参考方案1】:
egrep -ir --include=*.php,html,js "(document.cookie|setcookie)" .

r 标志表示递归搜索(搜索子目录)。 i 标志表示不区分大小写。

如果您只想要文件名,请添加l(小写L)标志:

egrep -lir --include=*.php,html,js "(document.cookie|setcookie)" .

【讨论】:

这似乎对我不起作用(至少在 mac 上不起作用)....只是挂起... egrep -lir --include=* "repo" egrep: 警告:递归搜索标准输入 您忘记添加搜索路径。路径是“。”在上面的例子中。在您的情况下,脚本正在等待输入在标准输入上搜索。试试: egrep -lir --include=* "repo" / (或任何其他路径) grep -E ... > egrep ... 我在 Ubuntu Desktop 16 上收到错误 grep: (error|fail): No such file or directory;有什么提示吗? 为了使这个工作,我不得不跳过 * 和 \。所以我有--include=\*.php,html,js【参考方案2】:

尝试类似grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-i 使其不区分大小写

末尾的. 表示您要从当前目录开始,这可以替换为任何目录。

-r 表示递归地执行此操作,就在目录树的下方

-n 打印匹配的行号。

--include 允许您添加文件名、扩展名。接受通配符

欲了解更多信息,请参阅:http://www.gnu.org/software/grep/

【讨论】:

或者也许使用-l 选项(只打印匹配的文件名)而不是-n【参考方案3】:

find 他们和grep 为字符串:

这将在 /starting/path 和 grep 中找到您的 3 种类型的所有文件以获取正则表达式 '(document\.cookie|setcookie)'。为了便于阅读,用反斜杠拆分 2 行...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

【讨论】:

类似于 find 的通用用法,但我认为最好使用 -exec grep -l 'sth' \; 感谢@Michael Berkowski 这种方式在 ~500Gb 重量目录上比 # egrep -ir --include=file.foo "(foo|bar)" /dir 快 5 或 8 倍以上。【参考方案4】:

对于grep 或ack 来说,这听起来像是一份完美的工作

或者这个奇妙的结构:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null  \;

【讨论】:

+1 使用-exec grep... 比我的xargs 方法更好,因为它不会阻塞文件名中的空格。 @MichaelBerkowski:您可以像这样使用它来处理文件名中的空格:find . -type f -print0 | xargs -0 -I grep "search_string" 。当然,也可以添加其他选项。【参考方案5】:
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

【讨论】:

【参考方案6】:

只是为了包括另一种选择,您也可以使用这个:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' \;

地点:

-regextype posix-extended 告诉 find 期望什么样的正则表达式 -regex "^.*\.(php|html|js)$" 告诉 find 正则表达式本身的文件名必须匹配

-exec grep -EH '(document\.cookie|setcookie)' \; 告诉find 为它找到的每个文件运行在-exec 选项和\; 之间指定的命令(及其选项和参数),其中 表示文件路径所在的位置这个命令。

同时

E 选项告诉 grep 使用扩展正则表达式(以支持括号)和... H 选项告诉grep 在匹配之前打印文件路径。

并且,鉴于此,如果您只想要文件路径,您可以使用:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' \; | sed -r 's/(^.*):.*$/\1/' | sort -u

在哪里

| [pipe] 将find 的输出发送到此之后的下一个命令(即sed,然后是sortr 选项告诉sed 使用扩展正则表达式。 s/HI/BYE/ 告诉 sed 将“HI”的每个第一次出现(每行)替换为“BYE”和... s/(^.*):.*$/\1/ 告诉它替换正则表达式 (^.*):.*$(意思是 [() 包含的东西] 包括 一切 [.* = 一个或多个任何-character] 从行首 [^] 直到'第一个':' 后跟任何东西 直到'行尾 [$]) 被替换的正则表达式的第一个 [\1]。 u 告诉 sort 删除重复的条目(以 sort -u 为可选)。

...远非最优雅的方式。正如我所说,我的目的是增加可能性的范围(同时对您可以使用的一些工具进行更完整的解释)。

【讨论】:

以上是关于查找包含给定文本的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何查找不包含给定字符串模式的文件?

如何在 Linux 上查找不包含文本的文本文件?

批量查找给定字符串条件的文件

markdown 查找包含特定文本的文件

markdown 查找包含特定文本的文件

在文件中查找给定单词的字谜