Bash

要求 Bash cd 進入某個路徑下的每個目錄並在其中執行命令?

  • April 7, 2017

以這條路徑為例:/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 {} \;

這實際上要做的是:

  1. 外殼會膨脹/var/www/html/*。讓我們假設它擴展為/var/www/html/foo/var/www/html/bar
  2. 外殼將擴展*(您的外殼中的那個cd *)。請注意,這是目前工作目錄。讓我們假設你有poptart
  3. 外殼將執行find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
  4. 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

引用自:https://unix.stackexchange.com/questions/355996