由于我们要升级到 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