#!/bin/bash #------------------------------------------------------------------------------ # Create Information # NAME : k-square # DESCRIPTION : Convert Business Cabinet Files to Windows Files for Cygwin # HISTORY : 2002/11/05 Create # 2003/03/19 BugFix "single quotation" #------------------------------------------------------------------------------ # # bcabar -c $cabid O/00560100/$cabid # 上記の形でbcabarを実行されたと想定 # 引数は以下のとおり # # $1 = OFFICE_ID ex) 00560100 # $2 = CABINET_ID ex) B999 # $3 = Input Directory ex) /log/sbd-scripts # $4 = Output Directory ex) /home/k-square # # こんな感じ↓で実行する # $ ./bcabar-unix2win.txt 00560100 B999 /home/soc /home/k-square # # export OFCID=$1 export CABID=$2 export INPUT=$3 export OUTPUT=$4 #------------------------------------------------------------------------------------- # エラー表示用関数 #------------------------------------------------------------------------------------- showusage() { echo "Error!" >&2 echo "Usage: `basename $0` office_id cabinet_id input_dir output_dir" >&2 echo "" >&2 echo "ex) `basename $0` 00560100 B999 /log/sbd-scripts /home/k-square" >&2 } #------------------------------------------------------------------------------------- # 初期化処理。 # 入力元のエラーチェック(ざる)と、出力先の作成と、ワーキングディレクトリへの移動 #------------------------------------------------------------------------------------- # 引数4つが正しそうかどうか、ディレクトリの存在で確認する # これ以外のエラーチェックはしない!!(笑) if [ ! -d "$INPUT/$CABID/office/$OFCID" ] then showusage exit fi if [ ! -d "$OUTPUT" ] then showusage exit fi # 出力先を準備 mkdir -p $OUTPUT/$CABID # ワーキングディレクトリへ移動 cd $INPUT/$CABID/office/$OFCID/$CABID #------------------------------------------------------------------------------------- # ディレクトリ階層の作成と、実体のあるファイルのリネーム(フォルダもあわせて連番)を # 行うシェルスクリプトを作成し実行する。 #------------------------------------------------------------------------------------- gawk-mb -F ',' ' #************************************************* # グローバルに使う変数の説明 #************************************************* # prefix : アウトプットディレクトリのprefix # lastid : IDの最後の番号 (IDは 1〜lastid) # path[] : IDを用いた階層構造 # (0を補完して、IDを6桁で扱う) # dirbool[] : ディレクトリなら "1" を定義 # そうでなければ未定義 # filebool[] : 実体のあるファイルなら "1" を定義 # そうでなければ未定義 # nameonwin[] : IDじゃないWindows上の本来の名称 # (2byte charあり、拡張子なし) # ex[] : 拡張子のみ("."から始まる) #************************************************* FILENAME == "node" { # ディレクトリの中でソートする為にpathに用いる番号3桁を生成する。 # 「3桁」と指定している値は埋め込みで2つあるのでご注意〜☆ prefix = "'"$OUTPUT/$CABID"'/"; if( $2 == "0" ){ # ファイルの前につけるソート用の数値を生成 if( sort[prefix] == "" ){ sort[prefix] = "1" ; } else{ sort[prefix]++; } # ソート用の数値を3桁に設定してpath[]を生成 tempname = sprintf( "%03d" , sort[prefix] ); path[$1] = prefix tempname; } else{ # ファイルの前につけるソート用の数値を生成 $2 = path[$2]"/"; if( sort[$2] == "" ){ sort[$2] = "1" ; } else{ sort[$2]++; } # ソート用の数値を3桁に設定してpath[]を生成 tempname = sprintf( "%03d" , sort[$2] ); path[$1] = $2 tempname; } # IDの最後の番号をとっておく(一番最後に使う) lastid = $1; } FILENAME == "container" { # ディレクトリかどうかの判断用配列 dirbool[$1] = "1"; # フォルダの作成実行コマンドの作成(UNIX path) print "mkdir "path[$1]; } # 「 \ / : , ; * ? " < > | 」 FILENAME == "component" { # Windows上でファイル名に使えない文字は全角文字にしちゃう! gsub( /^"/ , "" , $39 ); gsub( /"$/ , "" , $39 ); gsub( /\\/ , "¥" , $39 ); gsub( /\// , "/" , $39 ); gsub( /:/ , ":" , $39 ); gsub( /,/ , "," , $39 ); gsub( /;/ , ";" , $39 ); gsub( /\*/ , "*" , $39 ); gsub( /?/ , "?" , $39 ); gsub( /"/ , "”" , $39 ); gsub( // , ">" , $39 ); gsub( /\|/ , "|" , $39 ); gsub( /%20/ , " " , $39 ); gsub( /'"'"'/ , "’" , $39 ); # Windows上での実体の名称(拡張子なし) nameonwin[$1] = $39; } FILENAME == "docbody" { # 実体のあるファイルかどうかの判断用配列 filebool[$1] = "1"; # ex[] に小文字の拡張子を保存 gsub( /"/ , "" , $7 ); gsub( /"/ , "" , $3 ); sub( /^.*\./ , "." , $3 ); ex[$1] = tolower( $3 ); # ファイルの移動とリネームコマンドの作成(UNIX path) print "mv --backup=t '"$INPUT/$CABID"'/"$7" "path[$1]"'"'"'"nameonwin[$1]ex[$1]"'"'"'"; } END{ # ディレクトリの名前を変えるときは下の階層から # 変更していく必要があるため、IDの大きなほうから、小さなほうに向かって処理を行う。 for( i=lastid ; i>0 ; i-- ){ if( filebool[i] == "1" ){ # 何もしない。 # ファイルに関しては終わってる。 } else if( dirbool[i] == "1" ){ # ディレクトリ名の変更 print "mv "path[i]" "path[i]"'"'"'"nameonwin[i]"'"'"'"; } else{ # 実体の無いファイルを作成(区切りとか) print "touch "path[i]"'"'"'"nameonwin[i]"'"'"'"; } } } ' node container component docbody > $OUTPUT/$CABID/command.txt # 実際にディレクトリの作成とリネームの実施 bash -x $OUTPUT/$CABID/command.txt > $OUTPUT/$CABID/command.log 2>&1