我想子目錄,CD的列表爲每運行一個命令,這裏就是我想:Bash的for循環沒有完成循環
#!/bin/bash
for D in installedPlugins/*; do
if [ -d "${D}" ]; then
cd "${D}" && echo "${D}" && cd ..
fi
done
爲此,它會在第一子目錄,但由於某種原因不會繼續。
我想子目錄,CD的列表爲每運行一個命令,這裏就是我想:Bash的for循環沒有完成循環
#!/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 ..
...和voilà!腳本的currect目錄現在是「installedPlugins /」。
您可能打算使用cd ../..
或cd -
代替。正如命令已經指出的,它是更好地使用find
遍歷目錄,如:
find installedPlugins/ -type d -maxdepth 1 -exec echo "{}" \;
我猜第二次迭代的cd
失敗,因爲第一次迭代中改變你的工作目錄:
$D
已安裝Plugin/something。您將cd
轉換爲./installedPlugins/something/,然後cd回到./installedPlugins$D
已安裝Plugin/somethingElse。您將cd
轉換爲./installedPlugins/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
執行此任務。
在這個問題中沒有任何建議'find'會有所改進。 – chepner
這是pushd
和popd
的另一種方法。他們是有點吵,所以我把他們的輸出到/dev/null
:
#!/bin/bash
for D in installedPlugins/*; do
test -d "$D" && {
pushd "$D" > /dev/null
pwd
popd > /dev/null
}
done
'找到installedPlugins /型D'會給你可以用來做wahtever – anubhava
你可以用'CD中的所有子目錄 - '返回到以前的目錄 –
在另一個說明中,如果您只是在'installedPlugins/* /中使用'for D,您可以繞過'[-d「$ D」]'檢查。 do'。 ...(注意在'*之後加''')。這也會減少循環迭代(普通文件不會成爲glob擴展的一部分;只有目錄) – anishsane