我想获得一个子目录列表,cd进入每个子目录并运行一个命令,这就是我正在尝试的内容:
#!/bin/bash
for D in installedPlugins/*; do
if [ -d "${D}" ]; then
cd "${D}" && echo "${D}" && cd ..
fi
done
它为第一个子目录执行此操作但由于某种原因不会继续。
答案 0 :(得分:2)
您的脚本遍历2个目录到${D}
但只有一个目录(cd ..
)。例如:
cd "installedPlugins/SomeDir" && echo "installedPlugins/SomeDir" && cd ..
...和voilà!您脚本的当前目录现在是“installedPlugins /".
您可能打算使用cd ../..
或cd -
代替。正如命令中已经提到的,最好使用find
迭代目录,例如:
find installedPlugins/ -type d -maxdepth 1 -exec echo "{}" \;
答案 1 :(得分:2)
以下是pushd
和popd
的另一种方式。它们有点吵,所以我将它们的输出发送到/dev/null
:
#!/bin/bash
for D in installedPlugins/*; do
test -d "$D" && {
pushd "$D" > /dev/null
pwd
popd > /dev/null
}
done
答案 2 :(得分:0)
我猜第二次迭代的cd
失败了,因为第一次迭代改变了你的工作目录:
$D
是installedPlugins / something。您cd
进入./installedPlugins/something/,然后回到./installedPlugins $D
是installedPlugins / somethingElse。你{/ 1}}进入./installedPlugins/somethingElse,但由于你已经进入installedPlugins而失败了。您可以使用简单的cd
来解决问题:
find
答案 3 :(得分:0)
问题是,在您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
执行此任务。