Bash 脚本递归目录树

Bash Script Recursive Directory Tree

我正在编写 bash 脚本,我必须在其中以树的形式显示目录的内容。我知道有一条直线可以实现这一点,但我正在尝试使用递归算法来解决这个问题。

这是我目前的情况:

#!/bin/bash

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

cd 
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 Dir时,显示如下:

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

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

感谢您的帮助。

你唯一一次 "deindenting" 在 "indenting" 之后 space 的值是当你 return 到外循环并将其明确设置为 |.您需要在从任何对 tree 的递归调用 returning 之后立即执行此操作。最简单的方法是将更改本地化到函数。

#!/bin/bash

tree () {
    local space=
    ...
}