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=
...
}
我正在编写 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=
...
}