2016-04-28 85 views
0

我想子目录,CD的列表为每运行一个命令,这里就是我想:Bash的for循环没有完成循环

#!/bin/bash 
for D in installedPlugins/*; do 
    if [ -d "${D}" ]; then 
     cd "${D}" && echo "${D}" && cd .. 
    fi 
done 

为此,它会在第一子目录,但由于某种原因不会继续。

+1

'找到installedPlugins /型D'会给你可以用来做wahtever – anubhava

+1

你可以用'CD中的所有子目录 - '返回到以前的目录 –

+0

在另一个说明中,如果您只是在'installedPlugins/* /中使用'for D,您可以绕过'[-d“$ D”]'检查。 do'。 ...(注意在'*之后加''')。这也会减少循环迭代(普通文件不会成为glob扩展的一部分;只有目录) – anishsane

回答

2

你的脚本遍历2个目录到${D},但只有一个目录(cd ..)。例如:

cd "installedPlugins/SomeDir" && echo "installedPlugins/SomeDir" && cd .. 

...和voilà!脚本的currect目录现在是“installedPlugins /”。

您可能打算使用cd ../..cd -代替。正如命令已经指出的,它是更好地使用find遍历目录,如:

find installedPlugins/ -type d -maxdepth 1 -exec echo "{}" \; 
+2

但是,[不要使用'for'循环遍历'find']的输出(http://mywiki.wooledge.org/BashFAQ/001)。 – chepner

+1

当一个glob可以完成时,使用'find'确实没有任何好处。 – chepner

+0

@chepner谢谢,删除了错误的例子 – jotik

0

我猜第二次迭代的cd失败,因为第一次迭代中改变你的工作目录:

  • 第一次迭代,$D已安装Plugin/something。您将cd转换为./installedPlugins/something/,然后cd回到./installedPlugins
  • 第二次迭代,$D已安装Plugin/somethingElse。您将cd转换为./installedPlugins/somethingElse,但由于您已安装到installedPlugins中而失败。

你可以使用一个简单的find解决你的问题:

find ./installedPlugins/ -type d 
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执行此任务。

+1

在这个问题中没有任何建议'find'会有所改进。 – chepner

2

这是pushdpopd的另一种方法。他们是有点吵,所以我把他们的输出到/dev/null

#!/bin/bash 
for D in installedPlugins/*; do 
    test -d "$D" && { 
     pushd "$D" > /dev/null 
     pwd 
     popd > /dev/null 
    } 
done