查找包含给定文本的文件

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

我要怎么做?

176110 次浏览

听起来像是 grep或者 的完美工作

或者这个奇妙的结构:

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

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

-i使它对大小写不敏感

最后的 .表示你想从你的工作目录开始,这可以用任何目录代替。

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

-n打印匹配的行号。

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

更多信息见: http://www.gnu.org/software/grep/

它们和字符串的 grep:

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

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

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

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

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

只是为了包含更多的选择,你也可以使用这个:

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选项和 \;之间为它找到的每个文件指定的命令(带有选项和参数) ,其中 {}表示文件路径在这个命令中的位置。

    同时

    • 选项告诉 grep使用扩展的正则表达式(以支持括号)和..。
    • 选项告诉 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

在哪里

  • |[管道]将 find的输出发送到此后的下一个命令(即 sed,然后是 sort)
  • 选项告诉 sed使用扩展的正则表达式。
  • s/HI/BYE/告诉 sed用“ BYE”和..。
  • s/(^.*):.*$/\1/告诉它替换正则表达式 (^.*):.*$(意味着包含 一切[ .* = 一个或多个任意字符]的 小组[由 ()封闭的东西]从 这条线的起点[ ^]到“第一个”: “接着是 (^.*):.*$0到”(^.*):.*$1[ $])由替换的正则表达式的第一个 小组[ \1]。
  • u告诉 sort 去除重复的条目(使用 sort -u作为可选项)。

远不是最优雅的方式。正如我所说的,我的目的是增加可能性的范围(也是为了给出一些您可以使用的工具的更完整的解释)。