一个可以检查子目录中包含“hello”的文件并返回目录名称的脚本

一个可以检查子目录中包含“hello”的文件并返回目录名称的脚本

我需要一个脚本,在其中提供目录名称作为参数,脚本检查所有子目录.php文件,如果任何文件包含字符串“Hello”,则脚本列出包含目录的匹配文件。

答案1

通过以下命令,您可以找到包含该字符串的所有文件:

$ grep -lr Hello directoryname

grep搜索字符串(名称来自g/re/p您在编辑器中使用的ed“g”全局搜索“re”正则表达式,“p”打印匹配行)。

意思-l是“仅列出匹配的文件”,通常显示具有匹配行的文件名(顺便说一句:如果只给出一个文件,则其名称通常会被隐藏)。

意思-r是“递归搜索”。

现在您已经有了文件名,您需要删除文件名,因为您只需要包含匹配文件的目录的名称。这可以通过使用sed(流编辑器)添加管道来完成:

$ grep -lr Hello directoryname | sed 's:/[^/]*$::'

sfor 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接受。

相关内容