本站内容有下面分类知识,欢迎您的到来^_^

shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言

设soyo123为首页 收藏本站
当前位置:|主页>shell脚本欣赏>

类似tree命令的脚本

百度收藏 QQ搜藏

作者 plan9 [原创]
输出目录树:

一个输效果基本和tree命令的输出完全一样(除了目录未的工作不同),文件带色彩输出,文件、目录数统计,贴上来给大家做个参考:
tree.sh
------------------------------------------------------------

代码:
#!/bin/sh
#
# tree.sh
# A tool that display the dictionary structure in dos's
# tree command style.
# By Matthew <matthew@linuxforum.net>
#
#      __@
#  _ \<_
# (_)/(_)
# Apr 29 2003
#
# Tested on slackware, openbsd, netbsd, freebsd.
#
# Just for fun.
#

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

# COLOR DEFINE
# ============
#
DIR="\033[01;34m"
EXE="\033[01;32m"
DEV="\033[01;33m"
LNK="\033[01;36m"
ZIP="\033[01;31m"
SOCK="\033[01;35m"
NULL="\033[00m"

ROOT=${1:-.}
TRUE=0
FALSE=1
LAYERS=0
FILECOUNT=0
DIRCOUNT=0

# print_dash
# ==========
# Print the structure lines
#
print_dash()
{
 local i=0
 local num=$1
 
 while [ $i -lt $num ]; do
  echo -n "|"
  for j in 1 2 3; do
   echo -n " "
  done

  i=`expr $i + 1`
 done

 echo -n "|-- "
}

# ispkg
# =====
# Test if the file is a package like:
# .gz .tar .tgz .tar.gz .zip .rar .rpm
# and etc.
#
ispkg()
{
 local f=$1
 local i 

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

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

 for i in $pkg__ext; do
  f=${f%$i}
 done

 if [ "$f" != "$1" ]; then
  return $TRUE
 else
  return $FALSE
 fi
}

# mktree
# ======
# The main function, that print the
# dictionary structure in dos's tree
# command style. It's runs in nesting.
#
mktree()
{
 local f
 for f in `$LSPROG -1 $1 2> /dev/null`; do
  f=${f%/}
  f=${f##*/}
 
  # If dictionary then print it and enter
  # the nesting block.
  if [ -d $1/$f ]; then
   print_dash $LAYERS
   echo -e "${DIR}$f${NULL}"
   DIRCOUNT=`expr $DIRCOUNT + 1`

   LAYERS=`expr $LAYERS + 1`
   mktree $1/$f
  else
   print_dash $LAYERS
   # file is a symbol link
   if [ -L $1/$f ]; then
    echo -e "${LNK}$f${NULL}"
   # file is executable
   elif [ -x $1/$f ]; then
    echo -e "${EXE}$f${NULL}"
   # file is a device
   elif [ -c $1/$f -o -b $1/$f ]; then
    echo -e "${DEV}$f${NULL}"
   # file is a socket
   elif [ -S $1/$f ]; then
    echo -e "${SOCK}$f${NULL}"
   # file is a package
   elif `ispkg $f`; then
    echo -e "${ZIP}$f${NULL}"
   else 
    echo -e "$f"
   fi
   
   FILECOUNT=`expr $FILECOUNT + 1`
  fi
 done

 LAYERS=`expr $LAYERS - 1`
}

echo $ROOT
mktree $ROOT
echo "\`"
echo "$DIRCOUNT directories, $FILECOUNT files"
显示效果:
/home/matthew/
|-- src
|   |-- asm
|   |   |-- hello.s
|   |   |-- shell.s
|   |   |-- hello
|   |   |-- shell
|   |-- shell
|   |   |-- tree.sh
|-- xfce.tar.gz
|-- mbox
`
3 directories, 7 files


上一篇:自动挂载WINDOWS下的分区的脚本 下一篇:BASH调试器
power by soyo123 2007-2008