Bash脚本递归目录树

时间:2016-04-02 19:26:13

标签: bash algorithm unix recursion tree

我正在研究一个bash脚本,我必须以树的形式显示目录的内容。我知道有一个单行来完成这个,但我试图用递归算法弄明白。

这是我到目前为止所做的:

#!/bin/bash

tree(){
    space=$2
    if [ -d $1 ]
    then
        printf "%s" $space "-----|" $1
        printf "\n"
        cd $1
        space="$space-----|"
        for a in *
        do
            tree $a $space
        done
        cd ..
    else
        printf "%s" $space "-----|" $1
        printf "\n"
    fi
}    

cd $1
for file in *
do
    space="|"
    tree $file $space
done

我的目录“Dir”包含目录“SubDir1”,“SubDir2”,“SubDir3”和文件“filem”。 “SubDir1”包含文件“filea”,“fileb”和“filec”。 “SubDir2”包含目录“SubSubDir”和文件“fileg”,“fileh”和“filei”。目录“SubSubDir”包含文件“filed”,“filee”和“filef”。目录“SubDir3”包含文件“filej”“filek”和“filel”。

当我在命令行输入./dirtree目录时,会显示以下内容:

|-----|SubDir1
|-----|-----|filea
|-----|-----|fileb
|-----|-----|filec
|-----|SubDir2
|-----|-----|SubSubDir
|-----|-----|-----|filed
|-----|-----|-----|filee
|-----|-----|-----|filef
|-----|-----|-----|fileg
|-----|-----|-----|fileh
|-----|-----|-----|filei
|-----|SubDir3
|-----|-----|filej
|-----|-----|filek
|-----|-----|filel
|-----|filem

此输出几乎正确,但文件g到i不在目录SubSubDir中。问题在于我的间距。当文件不在前一个子目录中时,我需要重置破折号,但是我需要找到一个可以递归执行此操作的方法,以便破折号的数量适合树的深度。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

你唯一的时间" deindenting" "缩进"后space的值当你返回外部循环并将其明确设置为|时。从任何递归调用tree返回后,您需要立即执行此操作。最简单的方法是将更改本地化。

#!/bin/bash

tree () {
    local space=$2
    ...
}