我需要列印我所有的資料庫配置,我的專案使用 laravel 和 CI 框架。所以簡而言之,我正在尋找以下檔案。
.env→ 位于/var/www/example_system/.envdatabase.php→ 位于/var/www/example_system/application/config/database.phpcore_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
盡管(我認為)我已經使用-name ".env" -not \( -path "/var/www/*/config" -prune \)引數在我的 find 命令中明確排除了它。
所以我的問題是如何從查找中排除某些內容,如果目錄中有特定檔案。在這種情況下,如果有.env檔案,我想找到排除 config/database.php我優先考慮.env了database.php
uj5u.com熱心網友回復:
讓我們假設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 "$1")"/../.env ]' _ "{}" \; \
\) -print
這個想法是為database.php帶有-exec操作的檔案添加條件。該操作是對子shell 的呼叫,僅當命名的檔案.env不存在于該database.php檔案下的兩個層次結構級別時,該子shell 才會回傳true 。子shell腳本相當簡單:
! [ -f "$(dirname "$1")"/../.env ]
它需要一個引數:database.php檔案的路徑。它不作為-exec引數直接呼叫。相反,它被稱為 的腳本引數sh -c:
sh -c 'script' argv0 argv1...
argv0對應于$0腳本的引數(未使用,因此_我經常將其用作不關心的)并argv1對應于$1位置引數。
但由于它有點復雜,更直接的 bash 回圈可能更容易理解和維護:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372610.html
