如果目录中有特定文件,则从 find 中省略某些内容

Omit something from find if directory has specific file in it

我需要打印我所有的数据库配置,我的项目使用 laravel 和 CI 框架。所以简而言之,我正在寻找以下文件。

我正在使用以下查找命令来执行此任务。

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

但这不能满足我的需要,因为它仍然输出

尽管(我认为)我已经使用 -name ".env" -not \( -path "/var/www/*/config" -prune \) 参数在我的查找命令中明确排除了它。

所以我的问题是 如果目录中有特定文件,我如何从查找中排除某些内容。在这种情况下,如果有 .env 文件,我想找到 exclude config/database.php 因为我优先考虑 .env 超过 database.php

让我们假设 example_system 仅代表一个层次结构级别,并且如果文件存在,您总是希望打印 core_db.php

下面的比较复杂,find命令可能不远:

find /var/www -maxdepth 4 -type f \( \
  -name .env -o -name core_db.php -o \
  -name database.php -exec sh -c '! [ -f "$(dirname "")"/../.env ]' _ "{}" \; \
  \) -print

想法是使用 -exec 操作为 database.php 文件添加条件。该操作是对子 shell 的调用,仅当名为 .env 的文件不存在于 database.php 文件下的两个层次结构级别时,该子 return 才会为真。 sub-shell脚本相当简单:

! [ -f "$(dirname "")"/../.env ]

它有一个参数:database.php 文件的路径。它不作为 -exec 参数直接调用。相反,它被称为 sh -c:

的脚本参数
sh -c 'script' argv0 argv1...

argv0 对应于脚本的 [=25=] 参数(未使用,因此我经常使用的 _ 不关心)和 argv1 对应到 </code> 位置参数。</p> <p>但由于它有点复杂,更直接的 bash 循环可能更容易理解和维护:</p> <pre><code>for d in var/www/*/; do e="${d}.env" db="${d}application/config/database.php" c="${d}app/core/core_db.php" if [ -f "$e" ]; then echo "$e" elif [ -f "$db" ]; then echo "$db" fi if [ -f "$c" ]; then echo "$c" fi done