Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104673205
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 22:47:38

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

tree.sh
------------------------------------------------------------
代码:
#!/bin/sh
#
# tree.sh
# A tool that display the dictionary structure in dos's
# tree command style.
# By Matthew 
#
#    __@
#  _ \<_
# (_)/(_) 
# 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
阅读(752) | 评论(0) | 转发(0) |
0

上一篇:数制转换的脚本

下一篇:BASH调试器

给主人留下些什么吧!~~