如果目录中有特定文件,则从 find 中省略某些内容
Omit something from find if directory has specific file in it
我需要打印我所有的数据库配置,我的项目使用 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 /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
尽管(我认为)我已经使用 -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
我需要打印我所有的数据库配置,我的项目使用 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 /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
尽管(我认为)我已经使用 -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