以这条路径为例:/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 {} \;
这实际上要做的是:
- 外壳会膨胀
/var/www/html/*
。让我们假设它扩展到/var/www/html/foo
和/var/www/html/bar
。 - 外壳将膨胀
*
(您的外壳中的外壳cd *
)。请注意,这是当前工作目录。假设您有pop
和tart
。 - shell 将要运行
find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
。 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