>>>>> "matz" == Yukihiro Matsumoto <matz / netlab.co.jp> writes: > 「第1回!夏に出版予定Ruby本に採用されて著者サイン本 > をゲットしよう」大会 ということで、参加表明です。うまくゲットできるかな? この後、hex dump と簡単なサンプルにちょうどいいかもしれな い head(1) もどきがいきます。一度に書き過ぎかな? ruby スクリプトはこれが最初なので、「らしい」書き方ができ ていないと思うので、気がつくところがあればどんどん教えて ください。 # 小澤さんにはすでにはすでに助言いただいて、修正させていた # だきました。感謝。 このスクリプトを書いていていいなと思ったのは、変数のスコー プが分かりやすいことでした。宣言せずに「ローカル」という のはとてもいいです。また、グローバル変数が明示的なのも気 に入りました。 なれるとよさそうなので、ちょっとした UNIX のツールを ruby でインプリメントして勉強しようと思っています(私の新しい言 語の覚え方)。 ■ Ruby で tree ディレクトリの構造を表示する tree というコマンドがありま す。これの Ruby version です。 ■ 使い方 オプションを指定しない場合、カレントディレクトリの表示し ます。 ------------------------------ $ ruby tree.rb |-+ . |-- t1.rb |-- tree.rb |-- tree.rb,v |-- tree.rb~ 4 files ------------------------------ ディレクトリのみ表示、引数に -d と表示を行いたいディレク トリを指定します。 ------------------------------ $ ruby ~/src/ruby/tree.rb -d |-+ . |-+ ext | |-+ Win32API | |-+ curses | |-+ dbm | |-+ etc | |-+ fcntl | |-+ kconv | |-+ md5 | |-+ socket | |-+ tcltklib | | |-+ demo | | |-+ lib | | |-+ sample | |-+ tkutil |-+ lib |-+ missing |-+ sample |-+ win32 |-+ x68 19 directores ------------------------------ ディレクトリの深さを -level=「数字」で指定します。 ------------------------------ $ ruby tree.rb -d -l=3 /home/tetsu ------------------------------ ■ ソースコード ------------------------------ #! /usr/local/bin/ruby # /home/tetsu/src/ruby/tree.rb # Created: February 21,1998 Saturday 03:12:14 # Author: tetsu(WATANABE Tetsuya) # $Id: tree.rb,v 1.4 1998/02/23 14:40:45 tetsu Exp $ # usage: tree.rb [-adf] [-l=number] [dir_name] def tree(dir, level) return if $opt_l and level >= Integer($opt_l) dirp = Dir.open(dir) files = [] for f in dirp next if (f == '.' or f == '..') next unless $opt_a or f !~ /^\./ full = dir + File::Separator + f next if $opt_d and not test(?d, full) files.push(full) end dirp.close files = files.sort unless $opt_f prefix = ' ' + $prefix.join('') $prefix.push('| ') cnt = 1; for f in files if files.length == cnt $prefix[level] = ' ' end cnt += 1 if test(?d, f) print prefix, '|-+ ', File.basename(f), if test(?l, f); ' -> ' + File.readlink(f) else '' end, "\n" $cnt_dir += 1 tree(f, level + 1) unless test(?l, f) else print prefix, '|-- ', File.basename(f), if test(?l, f); ' -> ' + File.readlink(f) else '' end, "\n" $cnt_file += 1 end end $prefix.pop end def pr_cnt print "\n"; if ($cnt_dir) print $cnt_dir, ' director', if $cnt_dir > 1; 'es' else 'y' end end if ($cnt_file) print ' ' if $cnt_dir print $cnt_file, ' file', if $cnt_file > 1; 's' else '' end end print "\n" end def usage STDERR.print <<E usage: #$0 [-adf] [-level=number] [directory_name] -a all files(include .file) -f no sort -d directory only -l=num depth of directores E exit 1 end while $_ = ARGV[0] and /^-/ ARGV.shift if /[adf]/ $opt_a = 1 if /a/ $opt_d = 1 if /d/ $opt_f = 1 if /f/ elsif /^-(l|level)=(\d+)/; $opt_l = $2; else usage end end $prefix = [] dir = ARGV.shift || '.' print '|-+ ', dir, "\n" tree(dir, 0) pr_cnt exit ------------------------------ -- WATANABE Tetsuya HP Japan PSO e-mail tetsu / jpn.hp.com