我想获取一个子目录列表,cd到每个子目录并运行一个命令,这是我正在尝试的:
#!/bin/bash
for D in installedPlugins/*; do
if [ -d "${D}" ]; then
cd "${D}" && echo "${D}" && cd ..
fi
done
它对第一个子目录执行此操作,但由于某种原因不会继续。
> 您的脚本将 2 个目录遍历到 ${D}
中,但只有一个目录输出 ( cd ..
)。例如:
cd "installedPlugins/SomeDir" && echo "installedPlugins/SomeDir" && cd ..
。瞧!脚本的 currect 目录现在是 "installedPlugins/"。
您可能打算改用cd ../..
或cd -
。如命令中所述,最好使用 find
遍历目录,例如:
find installedPlugins/ -type d -maxdepth 1 -exec echo "{}" ;
pushd
和popd
的另一种方式。它们有点嘈杂,所以我将它们的输出发送到/dev/null
:
#!/bin/bash
for D in installedPlugins/*; do
test -d "$D" && {
pushd "$D" > /dev/null
pwd
popd > /dev/null
}
done
我猜第二次迭代的cd
失败,因为第一次迭代改变了你的工作目录:
- 第一次迭代,
$D
安装了插件/东西。你cd
./installedPlugins/something/,然后 cd 回到 ./installedPlugins - 第二次迭代,
$D
已安装插件/其他东西。 你cd
./installed插件/somethingElse,但这失败了,因为你已经进入了 installedPlugins。
您可以使用一个简单的find
来解决您的问题:
find ./installedPlugins/ -type d
一旦你cd
,问题就在于你在一个更深的目录中:
for D in installedPlugins/*; do
if [ -d "${D}" ]; then
cd "${D}" && echo "${D}" && cd ../.. # notice change here
fi
done
在第一个cd
,相对于你的点,你必须深度为2,而不是1。所以你需要回到 2 个级别。
注意:您应该为此任务使用find
。