#!/bin/csh -f # "@(#)tree.csh 2000/01/26" # Copyright(C)2000 ASH multimedia lab. (http://ash.jp/) # # tree: ファイルツリーを表示する # goto main usage: echo "usage: tree [options] [top_dir]" echo "options:" echo " -help ヘルプメッセージを表示する" echo " -a 罫線をASCII文字で表示する" echo " -f ディレクト以外のファイルも表示する" echo " -l リンク先も表示する" echo " -d level トップディレクトリから指定レベルの深さまで表示する" exit 1 main: set opt = () @ level = -1 set pre1a = '├─' set pre1b = '└─' set pre2a = '│ ' set pre2b = '  ' while ($#argv) switch ("$1") case -help: goto usage case -a: set pre1a = '+---' set pre1b = '+---' set pre2a = '| ' set pre2b = ' ' set opt = ($opt $1) breaksw case -f: set opt_f set opt = ($opt $1) breaksw case -l: set opt_l set opt = ($opt $1) breaksw case -d: if ($#argv < 2) goto usage @ level = $2 shift breaksw case -*: goto usage default: break endsw shift end if ($#argv > 1) goto usage if ($#argv == 0) set crntpath = . if ($#argv == 1) set crntpath = $1 alias ls '(unsetenv LANG; /bin/ls \!*)' set noglob if (! $?TREE_PRE1) then if (! -d "$crntpath") goto usage setenv TREE_LEVEL $level set pre1 = '' set pre2 = '' else @ level = $TREE_LEVEL if ($level != -1) @ level-- setenv TREE_LEVEL $level set pre1 = "$TREE_PRE1" set pre2 = "$TREE_PRE2" endif # ツリー表示するディレクトリ名(パス名の末尾)を取得 set crntpath = `echo $crntpath | sed 's|/*$|/|'` set work = $crntpath:h set crntdir = $work:t # シンボリックリンクディレクトリを表示 set ls = `ls -dl $crntpath:h | grep ^l` if ("$ls" != '') then set crntpath = `echo $ls[10] | sed 's|/*$|/|'` echo -n "$pre1$crntdir/ -> $crntpath" if (! $?opt_l) then echo '' exit endif else echo -n "$pre1$crntdir/" endif if (! -r $crntpath || ! -x $crntpath) then echo ': 許可を与えられていません。' exit else echo '' endif # 指定された深さに達した場合、配下は検索/表示しない if ($level == 0) exit # 配下のファイルを検索 if ($?opt_f) then set files = `ls -FLal $crntpath | awk '/^[-bclp]/{ print $NF }'` else set files = () endif # 配下のディレクトリを検索 set dirs = `ls -FLa1 $crntpath | grep /$` shift dirs; shift dirs # 配下のファイルを表示 @ filenum = 1 set pre_f = "$pre2$pre1a" foreach file ($files) if ($filenum == $#files && $#dirs == 0) then set pre_f = "$pre2$pre1b" endif set filename = `echo $file | sed 's|\*$||'` set ls = `ls -dl $crntpath/$filename | grep ^l` if ("$ls" != '') then echo "$pre_f$file -> $ls[10]" else echo "$pre_f$file" endif @ filenum++ end # 配下のディレクトリとその配下を表示(再帰) @ dirnum = 1 setenv TREE_PRE1 "$pre2$pre1a" setenv TREE_PRE2 "$pre2$pre2a" foreach dir ($dirs) if ($dirnum == $#dirs) then setenv TREE_PRE1 "$pre2$pre1b" setenv TREE_PRE2 "$pre2$pre2b" endif $0 $opt $crntpath/$dir @ dirnum++ end