要求 Bash cd 进入某个路径下的每个目录并在其中运行命令?

要求 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 {} \;

答案1

让我们首先拆开你的命令:

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. shell 将要运行find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
  4. find将抛出有关未终止命令的错误,因为它看到-exec但没有;or +

因此,为了清楚地了解发生了什么,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

答案2

tmp.sh让我们创建一个cd 到您的目录并完成工作的shell 脚本 。现在子进程中的 cd 不会影响父进程,因此脚本退出后,您将返回到调用目录

#!/bin/sh
cd "$1" 
wp plugin update --all

进而

 type d -name 'phpmyadmin' -maxdepth 0 ! -exec ./tmp.sh '{}' \;

答案3

另一种方法是使用一个小的 for 循环。你可以将其与

for folder in */; do <your-commands-on-$folder>; done

使用你的例子可能是

for folder in /var/www/html/*/phpmyadmin/; do cd "$folder"; wp plugin update --all; done

相关内容