免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3281 | 回复: 13
打印 上一主题 下一主题

一个自己写的tree程序,大家多多指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-28 11:24 |只看该作者 |倒序浏览
速度稍微有点慢,但是界面还行,大家指教一下需要改进的地方。环境是solaris,ksh

  1. treedir()
  2. {
  3.     #set -vx
  4.     TOTAL=`ls $1 | wc -l | bc`
  5.     TOTALIST=`echo "$TOTALIST:$TOTAL"`
  6.     if [ $TOTAL -ge 1 ]
  7.     then
  8.         NUM=1
  9.         for FNAME in `ls $1`
  10.         do
  11.             if [ $NUM -lt $TOTAL ]
  12.             then
  13.                 CHAR="├"
  14.             else
  15.                 CHAR="└"
  16.             fi
  17.             SPACE="$3 $CHAR"
  18.             if [ -d "$1/$FNAME" ]
  19.             then
  20.                 echo "$SPACE\\033[32;1m$FNAME\\033[0m"
  21.                 if [ $NUM -lt $TOTAL ]
  22.                 then
  23.                     CHAR="│"
  24.                 else
  25.                     CHAR=" "
  26.                 fi
  27.                 SPACE="$3 $CHAR"
  28.                 NUMLIST=`echo "$NUMLIST:$NUM"`
  29.                 treedir $1/$FNAME `expr $2 + 1` "$SPACE"

  30.                 eval `echo $NUMLIST | awk '
  31.                                         BEGIN {FS=":"}
  32.                                         {
  33.                                                 LIST=substr($0, 1, length($0) - length($NF) - 1);
  34.                                                 print "export NUM="$NF,"NUMLIST="LIST
  35.                                         }
  36.                                           '`

  37.             else
  38.                 echo "$SPACE$FNAME"
  39.             fi
  40.             
  41.             NUM=`expr $NUM + 1`
  42.         done

  43.     fi

  44.     eval `echo $TOTALIST | awk '
  45.                                   BEGIN {FS=":"}
  46.                                   {
  47.                                         LIST=substr($0, 1, length($0) - length($NF) - 1);
  48.                                         print "export TOTAL="$(NF-1),"TOTALIST="LIST
  49.                                   }
  50.                                '`

  51. }


  52. if [ $# -eq 0 ]
  53. then
  54.     DIR=`pwd`
  55. else   
  56.     DIR=$1
  57. fi
  58. echo "\\033[4m$DIR\\033[0m"
  59. #echo "--------------------------"
  60. NUMLIST="0"
  61. TOTALIST="0"
  62. treedir $DIR 0
复制代码


执行效果:

  1. user@ultra66 $ tree5 /etc/opt
  2. /etc/opt
  3. ├SUNWexplo
  4. │ ├cmd.txt
  5. │ ├default
  6. │ │ └explorer
  7. │ ├instinfo
  8. │ ├saninput.txt
  9. │ ├scinput.txt
  10. │ ├t3files.txt
  11. │ └t3input.txt
  12. ├license
  13. ├licenses
  14. │ ├LIC_CONFIG_FILE.WorkShop6.2
  15. │ ├LIC_CONFIG_SCRIPT
  16. │ ├LIC_CONFIG_SCRIPT.1
  17. │ ├LIC_CONFIG_SCRIPT.2
  18. │ ├LIC_CONFIG_SCRIPT.3
  19. │ ├LIC_CONFIG_SCRIPT.4
  20. │ ├LIC_CONFIG_SCRIPT.5
  21. │ ├LIC_CONFIG_SCRIPT.6
  22. │ ├config_template
  23. │ ├daemon_options
  24. │ ├licenses_combined
  25. │ ├licenses_combined.BAK
  26. │ ├licenses_combined.DUP
  27. │ ├lit
  28. │ └sunpro.loc
  29. └licenses.e2501.tar
复制代码

如果是英文的环境,会把├,└,│显示为乱码

论坛徽章:
0
2 [报告]
发表于 2005-03-28 11:41 |只看该作者

一个自己写的tree程序,大家多多指教

不错,最后再加句
  1. echo "\\033[39m"
复制代码
恢复回原先的显示颜色
这是我默认的颜色,别人的按自己的改哦~

论坛徽章:
0
3 [报告]
发表于 2005-03-28 11:50 |只看该作者

一个自己写的tree程序,大家多多指教

不错,顶楼主一下

论坛徽章:
0
4 [报告]
发表于 2005-03-28 11:53 |只看该作者

一个自己写的tree程序,大家多多指教

bash-2.03$ ksh tree.sh
/export/home/db2inst1/lipan
├arraytest.awk
├belts.awk
├c20417.001
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
└daliwa
   └test.txt
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
└data.f
└data.out
└db2diag.log
└db2eventlog.000.crash
└db2eventlog.001.crash
└db2eventlog.002.crash
└db2eventlog.003.crash
└db2inst1.nfy
└grade.txt
└grade_student.txt
└lock.sh
└myfile
└passwd.awk
└shell
   └changup.sh
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
└student_tot.awk
└t20417.001
└tbs.txt
└test.pl
└test.sh
└tree.sh
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近

不知道怎么回事啊?

论坛徽章:
0
5 [报告]
发表于 2005-03-28 12:38 |只看该作者

一个自己写的tree程序,大家多多指教

又有人写tree了
我写过一个,很快就沉了,再来一遍,发在你这,凑凑热闹

  1. #!/bin/bash
  2. #Show dir V1.0 20041213
  3. #Philonis

  4. PRE=""
  5. sum="0"

  6. USAGE()
  7. {
  8.         echo "Usage: $0 [path name]"
  9.         exit 1
  10. }

  11. vardir=$1

  12. CHDIR()
  13. {
  14.         PRE=$PRE"┃\t"
  15.         ls -p |sort -r >/tmp/tmp.$$
  16.         sfile=`wc -l < /tmp/tmp.$$`
  17.         for DIR in `cat /tmp/tmp.$$`
  18.         do

  19. sfile=$(($sfile-1))

  20.                 if [ "$sfile" = "0" ]
  21.                 then
  22.                         PRE=${PRE%"┃"*}"\t"
  23.                 fi

  24.                 if [ -d "$DIR" ]
  25.                 then
  26.                         blocks=$((`ls -l $DIR | head -1 |awk '{print $2}' `*512))" Bytes"
  27.                 else
  28.                         blocks=""
  29.                 fi


  30.                 if [ "$sfile" = "0" ]
  31.                 then
  32.                         echo -e "${PRE%"\t"*}┗━$DIR   $blocks  "
  33.                         sum="0"
  34.                 else
  35.                         echo -e "${PRE%"┃"*}┣━$DIR   $blocks  "
  36.                 fi
  37. if [ -d "$DIR" ]
  38.                 then
  39.                         cd $DIR
  40.                         (CHDIR $sfile)
  41.                         cd ..
  42.                 fi
  43.         done

  44. }
  45. #Main
  46. case $# in
  47.         0)
  48.         pwd
  49.         CHDIR 1
  50.         ;;
  51.         1)
  52.         if [ -d "$vardir" ]
  53.         then
  54.                 cd $vardir
  55.                 pwd
  56.                 (CHDIR 1)
  57.         else
  58.   USAGE
  59.         fi
  60.         ;;
  61.         *)
  62.         USAGE
  63.         ;;
  64. esac
  65. rm -f /tmp/tmp.$$
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-03-28 12:52 |只看该作者

一个自己写的tree程序,大家多多指教

不错~~,顶一顶

论坛徽章:
0
7 [报告]
发表于 2005-03-28 15:16 |只看该作者

一个自己写的tree程序,大家多多指教

这个是我收录的tree,是我见过的最好的tree

  1. #!/bin/sh
  2. #
  3. # tree.sh
  4. # A tool that display the dictionary structure in dos's
  5. # tree command style.
  6. # By Matthew <matthew@linuxforum.net>
  7. #
  8. #    __@
  9. #  _ \<_
  10. # (_)/(_)
  11. # Apr 29 2003
  12. #
  13. # Tested on slackware, openbsd, netbsd, freebsd.
  14. #
  15. # Just for fun.
  16. #

  17. # The name of the ls program, please use
  18. # the absolute path, otherwise, there
  19. # may be get some strange errors.
  20. #
  21. LSPROG="/bin/ls"

  22. # COLOR DEFINE
  23. # ============
  24. #
  25. DIR="\033[01;34m"               #兰色
  26. EXE="\033[01;32m"               #绿色
  27. DEV="\033[01;33m"               #黄色
  28. LNK="\033[01;36m"               #浅兰
  29. ZIP="\033[01;31m"               #红色
  30. SOCK="\033[01;35m"              #艳红
  31. NULL="\033[00m"                 #还原

  32. ROOT=${1:-.}
  33. TRUE=0
  34. FALSE=1
  35. LAYERS=0
  36. FILECOUNT=0
  37. DIRCOUNT=0

  38. # print_dash
  39. # ==========
  40. # Print the structure lines
  41. #
  42. print_dash()
  43. {
  44.         local i=0
  45.         local num=$1
  46.        
  47.         while [ $i -lt $num ]; do
  48.                 echo -n "|"
  49.                 for j in 1 2 3; do
  50.                         echo -n " "
  51.                 done

  52.                 i=`expr $i + 1`
  53.         done

  54.         echo -n "|-- "
  55. }

  56. # ispkg
  57. # =====
  58. # Test if the file is a package like:
  59. # .gz .tar .tgz .tar.gz .zip .rar .rpm
  60. # and etc.
  61. #
  62. ispkg()
  63. {
  64.         local f=$1
  65.         local i       

  66.         # Package extension list, you can add your coustom
  67.         # extensions in it.
  68.         #
  69.         local pkg__ext=".gz .tar .tgz .tar.gz .zip .rar .rpm"

  70.         # if the file's suffix contain any package extension
  71.         # then cut it.

  72.         for i in $pkg__ext; do
  73.                 f=${f%$i}
  74.         done

  75.         if [ "$f" != "$1" ]; then
  76.                 return $TRUE
  77.         else
  78.                 return $FALSE
  79.         fi
  80. }

  81. # mktree
  82. # ======
  83. # The main function, that print the
  84. # dictionary structure in dos's tree
  85. # command style. It's runs in nesting.
  86. #
  87. mktree()
  88. {
  89.         local f
  90.         for f in `$LSPROG -1 $1 2> /dev/null`; do
  91.                 f=${f%/}
  92.                 f=${f##*/}
  93.        
  94.                 # If dictionary then print it and enter
  95.                 # the nesting block.
  96.                 if [ -d $1/$f ]; then
  97.                         print_dash $LAYERS
  98.                         echo -e "${DIR}$f${NULL}"
  99.                         DIRCOUNT=`expr $DIRCOUNT + 1`

  100.                         LAYERS=`expr $LAYERS + 1`
  101.                         mktree $1/$f
  102.                 else
  103.                         print_dash $LAYERS
  104.                         # file is a symbol link
  105.                         if [ -L $1/$f ]; then
  106.                                 echo -e "${LNK}$f${NULL}"
  107.                         # file is executable
  108.                         elif [ -x $1/$f ]; then
  109.                                 echo -e "${EXE}$f${NULL}"
  110.                         # file is a device
  111.                         elif [ -c $1/$f -o -b $1/$f ]; then
  112.                                 echo -e "${DEV}$f${NULL}"
  113.                         # file is a socket
  114.                         elif [ -S $1/$f ]; then
  115.                                 echo -e "${SOCK}$f${NULL}"
  116.                         # file is a package
  117.                         elif `ispkg $f`; then
  118.                                 echo -e "${ZIP}$f${NULL}"
  119.                         else       
  120.                                 echo -e "$f"
  121.                         fi
  122.                        
  123.                         FILECOUNT=`expr $FILECOUNT + 1`
  124.                 fi
  125.         done

  126.         LAYERS=`expr $LAYERS - 1`
  127. }

  128. echo $ROOT
  129. mktree $ROOT
  130. echo "\`"
  131. echo "$DIRCOUNT directories, $FILECOUNT files"


  132. 显示效果:

  133. 代码:
  134. /home/matthew/
  135. |-- src                           #兰色
  136. |   |-- asm                       #兰色
  137. |   |   |-- hello.s               #黑
  138. |   |   |-- shell.s         
  139. |   |   |-- hello                 #绿色
  140. |   |   |-- shell
  141. |   |-- shell
  142. |   |   |-- tree.sh
  143. |-- xfce.tar.gz                   #红色
  144. |-- mbox
  145. `
  146. 3 directories, 7 files
复制代码

论坛徽章:
0
8 [报告]
发表于 2005-03-28 15:40 |只看该作者

一个自己写的tree程序,大家多多指教

不一定有颜色就是最好的吧 :wink:
我们的可是不会打印一堆难看的竖线哦,比较一下就知道了
还有每个目录下的最后一个文件前面的线条的处理
嘿嘿

论坛徽章:
0
9 [报告]
发表于 2005-03-28 17:37 |只看该作者

一个自己写的tree程序,大家多多指教

原帖由 "daliwa" 发表:
bash-2.03$ ksh tree.sh
/export/home/db2inst1/lipan
├arraytest.awk
├belts.awk
├c20417.001
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附近
awk:语句错 在第 2 行附近
awk:漏出 在第 2 行附..........

这个……这个……
我也不知道为啥呢,呵呵,环境是solaris么?

论坛徽章:
0
10 [报告]
发表于 2005-03-28 17:40 |只看该作者

一个自己写的tree程序,大家多多指教

http://chinaunix.net/jh/24/346943.html
这个很简练的,也比较快
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP