2016-04-28 105 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