bash for循环所有目录并执行命令

时间:2017-04-04 14:38:10

标签: bash shell unix for-loop

我已经在 abcd 开头的所有目录中执行for loop并且它正在运行。但是当我在根目录中有其他文件或东西时,它会在第一次循环后崩溃。

dir_1="./some/path1"
dir_2="./some/path2"
dir_3="./some/path3"

for f in ./abcd*;
    do      
        [ -d $f ] && cd "$f" && echo I am inside $f

        find $dir_1 -name something*.txt -exec cp {} $dir_3 \;
        find $dir_2 -name another*.txt -exec cp {} $dir_3 \;

        cd "$dir_3"
        # do some other stuff here
        cd ../../..     
    done;

有人可以帮我修理吗?

1 个答案:

答案 0 :(得分:3)

可以将glob本身限制为目录,此时如果cd失败,您可以直接跳到下一次迭代。

for f in ./abcd*/;
do      
    pushd "$f" || continue

    find "$dir_1" -name something*.txt -exec cp {} "$dir_3" \;
    find "$dir_2" -name another*.txt -exec cp {} "$dir_3" \;

    pushd "$dir_3"
    # do some other stuff here
    popd
    popd
done

pushdpopd会更改目录并更改回原点。 (由于您不能在两个popd之间执行任何操作,因此可以使用简单的pushd替换第二个cd并删除相应的popd。)< / p>