Bash for目录循环

时间:2016-11-27 21:49:56

标签: bash shell loops for-loop directory

我有一个bash脚本,我想在一个目录中运行一个程序,使用另一个目录中的文件作为输入

有几个输入文件,位于几个不同的目录中,每个目录都用作程序一次迭代的输入

这些文件是每个目录中的几个文件类型(.foo)

我的代码是

cd /path/to/data/
for D in *; do
    # command 1
    if [ -d "$D" ]
    then
        cd /path/to/data
        # command 2
        for i in *.foo
        do
            # command 3
        done
    fi
done

当我运行脚本时,输出如下

# command 1 output
# command 2 output
# command 3 output
# command 2 output
# command 2 output
# command 2 output
# command 2 output
# command 2 output
.
.
.

因此脚本完成了我期望它完成一次的操作,然后似乎没有在最后的for循环之后迭代

为什么会这样?

1 个答案:

答案 0 :(得分:0)

我认为你在“那么”之后有一个拼写错误... 更有意义的是:

then
  cd /path/to/data/$D
  # command 2

但正如cdarke建议的那样,最好避免在脚本中使用cd。 你可以得到相同的结果:

for D in /path/to/data; do
    # command 1
    if [ -d "$D" ]
    then
        # command 2
        for i in /path/to/data/$D/*.foo
        do
            # command 3
        done
    fi
done

或者您甚至可以使用find并避免使用if部分(代码越少,脚本越快):

for D in $(find /path/to/data -maxdepth 1 -type d)
# -type d in find get's only directories
# -maxdepth 1 means current dir. If you remove maxdepth option all subdirs will be found. 
# OR you can increase -maxdepth value to control how deep you want to search inside sub directories.