Bash中的树层次结构

时间:2014-11-23 13:38:03

标签: bash recursion tree

我试图在bash中实现一个函数,它显示给定深度的文件/目录树。它需要3个参数。

$1 = *current directory*
$2 = *current depth*
$3 = *lines*

例如,如果我的当前目录是" ... / living /",我的深度是2,我的函数应输出:

DIR .../living/
----DIR animals
--------FILE dog
--------FILE cat
----DIR plants
--------FILE flowers

如您所见,每次深度变化的线数增加4。文件类型(DIR,FILE)不是此线程的问题。 这就是我到目前为止所拥有的:

function tree {
    #some code to get the directory in variable cwd
    ...
    a=$(getType $cwd)
    echo "$a $cwd"
    depth=3 #the value does not matter, it's just for you guys to see
    drawTree $cwd $depth "----"
}

function drawTree {
    if [[ $2 == 0 ]]; then
         return
    fi

    dat=$1
    list=$(ls $dat)
    depth=$2
    lines=$3

    for d in $list; do
        f="$dat/$d"
        t=$(getType $f)
        echo "$lines$t $d"
        if [[ $t == "DIR" ]]; then
            g=$(($depth-1))
            l="$lines----"
            if [[ $g > 00 ]]; then
                drawTree $f $g $l
            fi
        fi
    done

这段代码的输出很遗憾,我不明白为什么。

1 个答案:

答案 0 :(得分:0)

该代码存在很多问题。

最严重的是你的变量不是本地的(参见help local),这在递归函数中可能是灾难性的。在drawtree的循环中,第二次迭代会看到对$depth$lines的不必要修改,这两种修改都会导致输出以不同方式出错。

此外:

g=$(($depth-1))
l="$lines----"
if [[ $g > 00 ]]; then
    drawTree $f $g $l
fi
如果没有那么多不必要的变量,使用算术而不是字符串比较,写得好得多:

if (( depth > 1 )); then
   drawTree $f $((depth - 1)) ${lines}----
fi

最后:

list=$(ls $dat)
for d in $list; do
如果文件路径中有空格或shell元字符,

将会失败。更好的是使用bash数组和glob扩展而不是ls命令):

# Create an array from a glob 
list=("$dat"/*)
# Use the elements of the array, individually quoted:
for d in "${list[@]}"; do