我需要一个脚本,在其中提供目录名称作为参数,脚本检查所有子目录.php
文件,如果任何文件包含字符串“Hello”,则脚本列出包含目录的匹配文件。
答案1
通过以下命令,您可以找到包含该字符串的所有文件:
$ grep -lr Hello directoryname
grep
搜索字符串(名称来自g/re/p
您在编辑器中使用的ed
“g”全局搜索“re”正则表达式,“p”打印匹配行)。
意思-l
是“仅列出匹配的文件”,通常显示具有匹配行的文件名(顺便说一句:如果只给出一个文件,则其名称通常会被隐藏)。
意思-r
是“递归搜索”。
现在您已经有了文件名,您需要删除文件名,因为您只需要包含匹配文件的目录的名称。这可以通过使用sed
(流编辑器)添加管道来完成:
$ grep -lr Hello directoryname | sed 's:/[^/]*$::'
是s
for substitute
,后面是匹配模式和替换文本。[^/]
表示“任何字符,不包括/”。表示*
零个或多个前一个对象。意思$
是“匹配行尾”。所以行尾的所有非斜杠字符,和前面的斜杠(匹配模式中的第一个字符)被替换为空字符串(因为替换文本为空)。
如果有多个文件包含正在搜索的字符串,则可能会多次显示一个目录。这可以通过再次扩展管道来解决:
$ grep -lr Hello directoryname | sed 's:/[^/]*$::' | uniq
uniq
删除连续重复的行,留下唯一的行(因此得名)。
答案2
find * -prune -type d -exec grep -qm1 'Hello' {}/*.php 2>/dev/null \; -print
将从当前目录中的所有元素 ( *
) 中选择目录 ( -type d
),而不下降到其中 ( -prune
) 并执行 ( -exec
) 检查 ( grep -q
) 每个元素 ( {}
) 如果它们甚至有一个 ( -m1
) 文件*.php
包含单词'Hello'
并被-print
接受。