#!/usr/local/bin/ruby -Ks =begin d: cd D:\Cvs11\minami\ruby_cgi_book\program c:\usr\local\bin\ruby dir_tree.rb 使い方 ruby dir_tree.rb (見たいディレクトリ) (間隔) とするだけ (見たいディレクトリ)を省略するとカレントディレクトリを走査します。 (間隔)を省略すると1になります。 =end def scan_files(path) # (1) result = [] # 結果配列の初期化 path[path.size - 1] = "" if path[-1, 1] == "#{File::Separator}" # 文字列の最後が/なら削除 #(2) files = Dir.glob("#{path}/*") # filesにpath内のファイル名全部を入れる files.each do |file| # filesをループ #(3) if FileTest::directory?(file) # このファイルがディレクトリなら #(4) result = result << [file] + scan_files(file) unless /^\.\.?$/ =~ file # ファイル名が.もしくは..ではなければscan_filesを呼び出し else #(5) result << file # ファイル名を結果配列に入れる end end #(6) result # 結果を返す end def recall_print(arr, dir_name, next_flag = nil, depth_str = ' ' * SpaceNum) arr.each_index do |i| data = arr[i] if data.type == Array current_dir_name = data.shift # 配列の初めのディレクトリ名を抜く name = current_dir_name.gsub(/^(#{dir_name})/, "") # ディレクトリ名から親名を抜く name.gsub!(/^#{File::Separator}/, "") print "#{depth_str}+#{'-' * SpaceNum} #{name}\n" # 階層表示 + -- + ディレクトリ名 if i + 1 >= arr.size # 配列に次のデータがなければ 階層表示を"|"なしにする depth_str_add = depth_str + ' ' + (' ' * (SpaceNum - 1)) else depth_str_add = depth_str + '|' + (' ' * (SpaceNum - 1)) end recall_print(data, current_dir_name, next_flag, depth_str_add) # 再帰呼び出し end end end # 初期設定 dir = ARGV[0] dir = Dir.pwd unless dir spacenum = ARGV[1].to_i spacenum = 2 unless spacenum SpaceNum = spacenum # 間隔 # Find.findでディレクトリの走査して拡張子がhtmlのファイルをfile_dataに入れる files = scan_files(dir) # ディレクトリ名表示 print "#{dir}\n" # 再帰的にディレクトリ構成を表示 recall_print(files, dir)