【发布时间】:2022-01-09 12:49:07
【问题描述】:
我需要打印我所有的数据库配置,我的项目使用 laravel 和 CI 框架。所以简而言之,我正在寻找以下文件。
-
.env→ 位于/var/www/example_system/.env -
database.php→ 位于/var/www/example_system/application/config/database.php -
core_db.php→ 位于/var/www/example_system/app/core/core_db.php
我正在使用以下 find 命令来执行此任务。
find /var/www -maxdepth 4 -type f -name ".env" -not \( -path "/var/www/*/config" -prune \) -o -path '*core/*' -name "core_db.php" -o -path '*config/*' -name "database.php"
哪个打印。
/var/www/baloon/app/core/core_db.php
/var/www/infinys/application/config/database.php
/var/www/duffyweb/.env
/var/www/duffyweb/config/database.php
/var/www/loseweb/.env
/var/www/loseweb/config/database.php
/var/www/resto_app/application/config/database.php
但这不能满足我的需要,因为它仍然输出两个
/var/www/duffyweb/config/database.php/var/www/loseweb/config/database.php
即使(我认为)我已经在我的 find 命令中使用 -name ".env" -not \( -path "/var/www/*/config" -prune \) 参数明确排除了它。
所以我的问题是如果目录中有特定文件,我如何从查找中排除某些内容。在这种情况下,如果有.env 文件,我想排除 config/database.php,因为我优先考虑.env 而不是database.php
【问题讨论】:
-
not和prune是双重否定。你确定这是你想要的吗?旁注:正如您已经知道文件在哪里,为什么不简单地使用通配符?例如/var/www/*/.env /var/www/*/application/config/database.php /var/www/*/app/core/core_db.php?如果example_system可以代表多个层次结构级别,您可以启用globstarbash 选项(shopt -s globstar)并在全局模式中将*替换为**。 -
您不应同时使用 path 和 name。也许你想要这样的东西:
-not -path '*/core/*.php' -not -path '*/config/*.php' -
@RenaudPacalet 我一直在关注这个answer,是的,实际情况是在/var/www 的20 多个项目中寻找该文件,每个项目至少有
.env和@ 987654347@ 在 1 个项目中,如果项目有.env文件,我会尝试排除配置一。 -
@Darkman 谢谢,但我想保留所有其他结果(他们的目录中没有
.env),你的方法阻止了这种可能性。