查找包含给定文本的文件


153

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

我该怎么办?


4
您是否考虑过仅使用grep?cyberciti.biz/faq/grep-in-bash
特伦斯

这个标题是相当误导的。“找到包含给定文本的文件”
Josh C

Answers:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

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

如果只需要文件名,请添加l(lowercase L)标志:

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

似乎对我不起作用(至少在Mac上不行)....只是挂起... egrep -lir --include = *“ repo” egrep:警告:递归搜索stdin
Dean Hiller

13
您忘记添加搜索路径。路径是“。” 在上面的示例中。在您的情况下,脚本正在等待输入在stdin上进行搜索。试试:egrep -lir --include = *“ repo” /(或任何其他路径)
LodeRunner 2014年

1
grep -E ... >egrep ...
阿曼2014年

grep: (error|fail): No such file or directory在Ubuntu Desktop 16上出现错误;有什么提示吗?
Nam G VU

为了使此功能有效,我不得不用*跳过*。所以我有--include=\*.{php,html,js}
Mehrad Mahmoudian

53

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

-i使得它不敏感

.你想从你的当前目录开始结束手段,这可以与任何目录取代。

-r目录树下递归地执行此操作

-n打印匹配项的行号。

--include让你添加的文件名,扩展名。接受通配符

有关更多信息,请参见:http : //www.gnu.org/software/grep/


4
或使用-l选项(仅打印匹配的文件名)代替-n
glenn jackman 2011年

15

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)'

1
就像find的通用用法一样,但在我看来,更好地使用-exec grep -l 'sth' {} \;
NGix 2012年

感谢@Michael Berkowski这样,# egrep -ir --include=file.foo "(foo|bar)" /dir在〜500Gb weigth目录上最快超过5或8倍。
Qh0stM4N

9

听起来像是一份完美的工作,grep或者也许是肯定的

或这个奇妙的结构:

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

+1使用-exec grep...优于我的xargs方法,因为它不会阻塞文件名中的空格。
Michael Berkowski

@MichaelBerkowski:您可以像这样使用它来处理文件名中的空格:find . -type f -print0 | xargs -0 -I {} grep "search_string" {}。当然,也可以添加其他选项。
Pascal

4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

3

仅包括另一种替代方法,您还可以使用以下方法:

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然后是sort
  • r选项告诉sed您使用扩展的正则表达式。
  • s/HI/BYE/告诉sed将“ HI”的每个“首次出现”(每行)替换为“ BYE”,然后...
  • s/(^.*):.*$/\1/告诉它来代替正则表达式(^.*):.*$(意味着 [东西由包围()],包括一切 [ .*从=一个或多个任意的字符的] 的行的开头 [ ^]直到“第一‘:’随后任何直到”的的端行 [ $])由替换后的正则表达式的第一 [ \1]组成。
  • u告诉sort删除重复项(sort -u作为可选项)。

...远非最优雅的方式。正如我所说,我的目的是扩大可能性的范围(并就可以使用的某些工具给出更完整的说明)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.