LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 11830|回复: 53

写了一个显示目录树的脚本,可输出不对

[复制链接]
发表于 2003-4-24 22:13:50 | 显示全部楼层 |阅读模式
最近开始学习bash,我想写一个脚本,实现如下的类似列出目录树的功能(脚本中以TAB来显示层次):

设计目标是:
#./tree.sh /home/lyoo/GNUstep
/home/lyoo/GNUstep
  Defaults
    WindowMaker
    WMGLOBAL
    WMRootMenu
    WMState
    WMWindowAttributes
    WPrefs
  Library
    Icons
    WindowMaker
        autostart
        Backgrounds
        IconSets
        Pixmaps
        plmenu
        Sounds
        SoundSets
        Styles
        Themes


  1. #!/bin/bash

  2. recdir ()
  3. {
  4.     tab=$tab$singletab

  5.     for file in "$@"; do
  6.         echo -e $tab$file
  7.         thisfile=${thisfile:-$PWD}/$file

  8.         if [ -d "$thisfile" ]; then
  9.             recdir $(ls $thisfile)
  10.         fi
  11.         thisfile=${thisfile%/*}
  12.     done

  13.     tab=${tab%\t}
  14. }

  15. singletab="\t"

  16. for file in "$@"; do
  17.     echo $file
  18.     if [ -d "$file" ]; then
  19.         cd $file
  20.         recdir $(ls)
  21.         cd ..
  22.     fi
  23. done
复制代码


可是上面的脚本只能列出第一层目录,再往下就乱了套,请大家帮忙看看
发表于 2003-4-24 22:21:26 | 显示全部楼层
粗略的看了看,很不错,是不是把ls加个-R选项呢?
发表于 2003-4-24 22:48:04 | 显示全部楼层
$for i in $(ls -R);do echo $i;done
是不是这样的结果呢?
 楼主| 发表于 2003-4-24 23:07:30 | 显示全部楼层
谢谢JavaLee兄的指点!

  1. for i in $(ls -R $1);do
  2.  echo $i ;
  3. done
复制代码

的确可以轻松实现正确的目录显示,不过要在实现目录层次效果,就比较困难了。

另外,我写这个脚本的目的不是要实现这个功能,而是想学习一下Bash中的函数嵌套的用法,呵呵,还请大伙多多指导。
 楼主| 发表于 2003-4-25 11:38:16 | 显示全部楼层

  1.         thisfile=${thisfile%/*}
  2.     done

  3.     tab=${tab%\t}
  4. }
复制代码


呵,我真是晕呀
问题出在tab=${tab%\t},\t要‘\t’才行。
发表于 2003-4-25 15:33:50 | 显示全部楼层
烦LY00兄把写好的脚本帖在[脚本欣赏区],让兄弟们学习,(别忘了要注释的哟) ;)
谢谢~~
 楼主| 发表于 2003-4-25 16:24:54 | 显示全部楼层
呵呵,行,那我就现学现卖了,下一步想真正显示树状结构,并加一个指定目录层次深度的参数。
 楼主| 发表于 2003-4-26 20:38:22 | 显示全部楼层
郁闷呀,呵,写这目录树比想象要难多了。下面的代码还是有问题,设计方案比较笨,帖出来大家看,还有什么好方法。


  1. #!/bin/bash

  2. #redir()是一个遍历目录的函数,tab用来计算目录名的步进长度,
  3. #真正进行的绘图的变量是line

  4. redir ()
  5. {
  6.         tab=$tab$singletab
  7.         line=${tab%"$singletab"}"|-------"
  8.        
  9.         #观察目录树结构,可发现处于底部的目录需做特殊处理
  10.         #以参数数目作为循环条件
  11.         count=$#

  12.         for file in "$@"; do
  13.                 #将当前目录下的文件加入路径,为判断做准备
  14.                 thisfile=${thisfile:-$PWD}/$file
  15.        
  16.                 #判断是当前文件否为目录
  17.                 if [ -d "$thisfile" ]; then
  18.                        
  19.                         #如果是排在列表最后的目录,则去掉其前一个TAB的|
  20.                         if [ $count -eq 1 ]; then
  21.                                 echo -e $line$file
  22.                                 tab=${tab%"$singletab"}"\t"
  23.                                 line=${tab%"\t"}"|-------"
  24.                                 redir $(ls $thisfile)
  25.                         else

  26.                                 #如果是普通目录,需在目录名后加/
  27.                                 echo -e $line$file/
  28.                                 redir $(ls $thisfile)
  29.                         fi
  30.                        
  31.                 else
  32.                         #如果是普通文件则只输出文件名
  33.                         echo -e $line$file
  34.                 fi
  35.                
  36.                 #为退回上层目录做准备
  37.                 thisfile=${thisfile%/*}
  38.                 let count=count-1       
  39.         done
  40.        
  41.         #从下层目录循环出来,前移一个TAB
  42.         tab=${tab%"$singletab"}
  43.         line=${tab%"$singletab"}"|-------"
  44. }

  45. #####################################

  46. singletab="|\t"
  47. userinput="$@"

  48. # 默认为显示当前目录结构
  49. for file in ${userinput:-.}; do
  50.         echo $file
  51.         echo '|'
  52.         if [ -d "$file" ]; then
  53.                 cd $file
  54.                 redir $(ls)
  55.                 cd ..
  56.         fi
  57. done
复制代码
发表于 2003-4-26 20:55:05 | 显示全部楼层
你是不是要写出像在DOS下tree这样的命令么?
 楼主| 发表于 2003-4-26 21:06:14 | 显示全部楼层
正是正是,感觉我的流程比较别扭,但没想出更好的来,javalee有什么建议?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表