#!/usr/bin/env ruby $KCODE = 'e' SCRIPTNAME = 'unescape_symlink.rb' SYNOPTIC = "#{SCRIPTNAME} はカレントディレクトリ内で URI エンコードされている 日本語ファイル名に対し, デコードした日本語のシンボリックリンクファイル を作成する." USAGE = "#{SCRIPTNAME} [OPTIONS]" MAINTAINERS = ['Yasuhiro MORIKAWA ', 'Youhei SASAKI'] UPDATE = '2008/04/25' VER = '0.4' URL = 'http://epa.scitec.kobe-u.ac.jp/~itpass/epa/hiki_cvsutil/unescape_symlink.rb' # 履歴: # # Ver. 0.4, 2008/04/25 森川 靖大 # - URI デコードした文字列に "/" が含まれる場合には "・"に置き換える. # # Ver. 0.3, 2008/04/24 森川 靖大 # - リンク切れシンボリックリンクの削除オプション -d の作成 # - 普段の出力を簡素にし, 詳細出力が必要な場合には -v オプションを使用するようにする # - 末尾に "~" および ".bak" のつくファイルに関してはシンボリック # リンクを作成しない # # Ver. 0.2, 2008/03/05 佐々木洋平 # - 文字コードを判定して, 作成する日本語ファイル名を LANG に合わせる # ようにしてみた. # # Ver. 0.1, 2007/10/25 森川 靖大 # - とりあえず作った. require 'uri' # 文字コード変換用 require 'kconv' # オプション解析 require 'optparse' opt = OptionParser.new('', 20, ' ' * 6) OPTS = Hash.new OPTS[:submit] = 'save' opt.on('-n', '--dry-run', 'どのように動作するかを表示し, 実際は動作しない.' ) { OPTS[:dryrun] = true } opt.on('-v', '--verbose', '詳細に出力する' ) { OPTS[:verbose] = true } opt.on('-d', '--delete', 'リンク先が存在しないシンボリックリンクを削除する' ) { OPTS[:delete] = true } opt.on('-a', '--all', '末尾に "~" や ".bak" のつくファイルにも シンボリックリンクを作成' ) { OPTS[:all] = true } opt.on('-h', '-H', '--help', 'この, ヘルプメッセージを出力.' ) { OPTS[:help] = true } opt.parse!(ARGV) rescue OPTS[:error] = $!.to_s # [-h, -H, --help] でヘルプを出力して終了 if OPTS[:help] HELP = " #{SCRIPTNAME} SYNOPTIC: #{SYNOPTIC} USAGE: #{USAGE} OPTION: #{opt.help} VERSION: #{SCRIPTNAME} Version #{VER}, Last Update: #{UPDATE}. URL: #{URL} MAINTAINERS: " print(HELP) MAINTAINERS.each { |v| print "%6s" % ' ', v, "\n" } print "%8s" % ' ', "All Right Reserved.\n\n" exit 0 end no_creation = true delete_list = [] Dir.glob('*').each{|fd| if OPTS[:delete] if File.symlink?(fd) && !(File.exist?(fd)) delete_list << fd end end next unless File.file?(fd) unless OPTS[:all] next if fd =~ /~$/ next if fd =~ /\.bak$/ end if ENV['LANG'] =~/EUC/ symname = URI.unescape(fd).toeuc elsif ENV['LANG'] =~/UTF/ symname = URI.unescape(fd).toutf8 elsif ENV['LANG'] =~/SJIS/ symname = URI.unescape(fd).tosjis else symname = URI.unescape(fd) end if symname =~ /\// symname.gsub!(/\//, '・') end next if fd == symname if File.exist?(symname) print "symbolic link `#{symname}' -> `#{fd}' is already exist.\n" if OPTS[:verbose] else no_creation = false print "create symbolic link `#{symname}'" print " -> `#{fd}'" if OPTS[:verbose] print "\n" unless OPTS[:dryrun] File.symlink(fd, symname) end end } if no_creation print "All symbolic links are already created.\n" end if delete_list.size > 0 print "Following invalid symbolic links will be deleted.\n\n" delete_list.each{|df| print " " + df + "\n" } print "\n" print "OK? [Y/n]:" yorn = STDIN.gets.chomp unless yorn =~ /^n/i delete_list.each{|df| File.delete(df) } print "Above files are deleted.\n" else print "Above files are not deleted.\n" end end