Bash
要求 Bash cd 進入某個路徑下的每個目錄並在其中執行命令?
以這條路徑為例:
/var/www/html
.在 dir 裡面
html
,有幾個子目錄。cd
我需要係統通過(它必須是)進入這些子目錄中的每一個cd
,然後當它在這個目錄中時執行一個命令,回到 /var/www/html 並重複下一個過程目錄這是我嘗試過的,但似乎無效:
find /var/www/html/* -type d -maxdepth 0 ! -name 'phpmyadmin' -exec cd * && wp plugin update --all {} \;
讓我們先拆開你的命令:
find /var/www/html/* -type d -name 'phpmyadmin' -maxdepth 0 ! -exec cd * && wp plugin update --all {} \;
這實際上要做的是:
- 外殼會膨脹
/var/www/html/*
。讓我們假設它擴展為/var/www/html/foo
和/var/www/html/bar
。- 外殼將擴展
*
(您的外殼中的那個cd *
)。請注意,這是目前工作目錄。讓我們假設你有pop
和tart
。- 外殼將執行
find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
。find
將拋出有關未終止命令的錯誤,因為它看到-exec
但沒有;
或+
。因此,為了清楚發生了什麼,shell 正在拆分這條線,並且只將您想要作為參數的一部分傳遞給
find
.最乾淨,最簡單的方法
find
是:find /var/www/html/* -type d -name phpmyadmin -maxdepth 0 -exec sh -c 'cd "$1" && wp plugin update --all' -- {} \;
這引用了整個命令,將其提供給
sh
,然後將目錄作為參數傳遞。這也是個人喜好,但對於這樣的東西,我會說不使用更容易
find
:for dir in /var/www/html/*/; do cd "$dir" && wp plugin update --all; done