grep 显示包含包含字符串的文件的文件夹

grep 显示包含包含字符串的文件的文件夹

由于我们要升级到 CI2,我需要在服务器上运行 grep 来搜索扩展 CodeIgniter 1 文件的文件。一个文件夹中包含数百个特定于站点的文件夹,如下所示:

dev/sitea.com/site/www
dev/siteb.com/site/www
dev/sitec.com/site/www
... and so on

我怎样才能 grep 找到哪些文件夹直接在 dev 下包含一个引用字符串“MY_Output”(php 文件)的文件(或变量子文件夹中的多个文件)

我知道-l列出文件的标志,但我不确定如何将它与其他标志放在一起以表示“显示哪些网站包含带有此字符串的文件

这可能吗?谢谢!

编辑:只需澄清一下,这些站点级文件夹将包含扩展 MY_Output.php 的文件,这是一个常见的共享文件:

class Whatever extends MY_Output

答案1

这是我的方法:

find dev -type f -print0 | \          # find all files
xargs -0 grep 'extends MY_Output' | \ # search for your string
cut -d/ -f2  | \                      # extract web folder name
sort | uniq                           # eliminate duplicates

注意使用print0参数 tofind-0(零)标志 to xargs,这可以避免文件名中嵌入空格时出现的问题。

答案2

我发现发布的各种解决方案中有很多不必要的复杂性。考虑以下内容:

grep -r [regex to find] [path to search] | awk -F: '{print $1}' | uniq

答案3

要找出哪些网站包含 MY_output.php 文件,请按以下步骤操作:

使用 PuTTY 登录服务器。您应该会看到如下命令提示符:

username@hostname:~$

更改为您的 dev 目录(不确定它在您的服务器上的位置,也许在 /var/www 下?)

cd /var/www/dev

确保我们在正确的目录中

ls

我们应该得到如下结果:

sitea.com
siteb.com
sitec.com

现在找到每个包含 MY_output.php 的文件,然后将列表缩短为仅包含域:

grep -rsl "extends MY_output" * | cut -d/ -f1 | sort | uniq

Grep 在所有网络目录中递归查找所有匹配的文件。 cut 命令会拆分路径并仅提供第一个目录名称(sitea.com、siteb.com 等)。 sort 和 uniq 命令只会删除重复的条目,因此每个域仅出现一次。

享受!

答案4

如果你登录到你的服务器然后 cd 到 dev 文件夹,这应该可以工作:

egrep -rl 'class \S+ extends MY_Output' * | awk -v FS="/" '{print $2}' | sort | uniq -c

这将仅选择确实具有扩展 MY_Output 类的类的站点,并且还会为您提供该站点内可以更改的文件数量。您还可以使用 cut 实用程序代替 awk:

egrep -rl 'class \S+ extends MY_Output' * | cut -d/ -f2 | sort | uniq -c

相关内容