【问题标题】:Bash Script Recursive Directory TreeBash 脚本递归目录树
【发布时间】:2016-07-22 12:39:02
【问题描述】:

我正在编写一个 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 Dir时,显示如下:

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

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

感谢您的帮助。

【问题讨论】:

    标签: bash algorithm unix recursion tree


    【解决方案1】:

    唯一一次在“缩进”之后“去缩进”space 的值是在返回外部循环并将其显式设置为 | 时。从任何对tree 的递归调用返回后,您需要立即执行此操作。最简单的方法是将更改本地化到函数。

    #!/bin/bash
    
    tree () {
        local space=$2
        ...
    }
    

    【讨论】: