查找包含给定文本的文件
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
,然后是sort
)
r
选项告诉sed
使用扩展正则表达式。
s/HI/BYE/
告诉 sed
将“HI”的每个第一次出现(每行)替换为“BYE”和...
s/(^.*):.*$/\1/
告诉它替换正则表达式 (^.*):.*$
(意思是 组 [()
包含的东西] 包括 一切 [.*
= 一个或多个任何-character] 从行首 [^
] 直到'第一个':' 后跟任何东西 直到'行尾 [$
]) 被替换的正则表达式的第一个 组 [\1
]。
u
告诉 sort 删除重复的条目(以 sort -u
为可选)。
...远非最优雅的方式。正如我所说,我的目的是增加可能性的范围(同时对您可以使用的一些工具进行更完整的解释)。
【讨论】:
以上是关于查找包含给定文本的文件的主要内容,如果未能解决你的问题,请参考以下文章