bash script でwripeバックアップファイルの変換処理を書いた

主な内容

  • bash script
  • Ubuntu 14.04で確認
  • UTF8,LF変換にnkf のインストールが必要
  • ファイル変換内容
    • 1行目(wripeタイトル)から、ファイル名決定
      • ファイル名に使用できる文字列変換
      • wripeタイトルに日付が入っていた場合の処理をある程度考慮
    • 1行目は削除
    • UTF8,LF変換
    • tag 空白4文字変換

起動引数

  • 第一引数:バックアップファイルの保存先

疲れた….

#!/bin/bash
DIR_IN=$1
OUT_NAME=out
DIR_OUT=$DIR_IN/$OUT_NAME

which nkf 1>/dev/null 2>/dev/null
RC=$?
if [ $RC -ne 0 ]; then
    echo "nkf not installed!"
    return
fi

if [ "" == "$1" ]; then
    echo "arg1(input directory) is blank!"
    return
fi

if [ -d $DIR_IN ]; then
    # specified directory is exist.
    if [ -e $DIR_OUT ]; then
        # out dir is exist.
        echo "out dir $DIR_OUT exist! ok!"
        if [ -f $DIR_OUT ]; then
            # file
            echo "out dir $DIR_OUT is file..."
            return
        fi
    else
        # out dir is not exist.
        echo "make $DIR_OUT directory!"
        mkdir -p $DIR_OUT
    fi
else
    echo "$DIR_IN is not exist or file!"
    return
fi

err_files=""
for f in `find $1 -type d -name "$OUT_NAME" -prune -o -type f -name "*.txt" -o -name "*.md" -print`
do

    # ファイルの1行目をline変数へ格納
    line=`head -n 1 "$f"`
    # echo ${line}
    #   => 「YYYY/M/D タイトル」形式


    # 最初に出てくるドット、またはスペースを区切りに後ろを削除
    dt=`echo ${line} |sed -E "s/[\.| ].+//g"`
    if [[ "$dt" =~ ^[0-9]{8}$ ]]; then
        # "YYYYMMDD ","YYYYMMDD." に一致
        # ~は正規表現を使用するの意味
        # echo "matched"
        ymd="$dt"
    elif [[ "$dt" =~ ^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2}$ ]]; then
        # "YYYY/M/D ","YYYY/M/D." に一致
        # echo "matched date"
        # 日付取り出し&ゼロパディング
        yyyy=`echo ${dt} |sed -E "s|^([0-9]+)/([0-9]+)/([0-9]+)|\1|g"`
        mm=`echo ${dt} |sed -E "s|^([0-9]+)/([0-9]+)/([0-9]+)|\2|g"`
        if [[ ! "$mm" =~ ^0[0-9]$ ]]; then
            mm=`printf "%02d" $mm`
        fi
        dd=`echo ${dt} |sed -E "s|^([0-9]+)/([0-9]+)/([0-9]+)|\3|g"`
        if [[ ! "$dd" =~ ^0[0-9]$ ]]; then
            dd=`printf "%02d" $dd`
        fi
        ymd="$yyyy$mm$dd"
    else
        echo "[Error] Unknown date format! file=$f dt=$dt"
        err_files="${err_files}${f}\n"
        continue
    fi

    # ファイルの1行目からタイトルのみ取り出し
    # name=`echo ${line} |sed -E "s|^[0-9]+/[0-9]+/[0-9]+ +||g"`
    name=`echo ${line} |sed -E "s|^$dt[\.| ]+||g"`
    echo "$f => ${name}"

    # 特殊文字列置換
    # echo $name
    # name=`echo $name |sed -E "s| |_|g"`
    name=`echo $name |sed -E "s|\(|(|g"`
    name=`echo $name |sed -E "s|\)|)|g"`

    # ファイルコピー&変換
    newfilename="$ymd.$name.md"
    # echo $newfilename
    newfilepath=$DIR_OUT/$newfilename

    if [ -e "$newfilepath" ]; then
        # 同一ファイルが存在した場合
        echo "[Error] File Already Exist! file=$f"
        err_files="${err_files}${f}\n"
        continue
    fi

    echo "copy and convert file! $f => \"$newfilepath\""
    # file copy.
    cp "$f" "$newfilepath"
    # LF UTF8 convert.
    # echo "convert file LF!UTF8! $newfilepath"
    nkf -wLu --overwrite "$newfilepath"
    # head one line delete!.
    # echo "head one line delete! $newfilepath"
    sed -e '1,1d' "$newfilepath" > "$newfilepath.tmp.md"
    # tab space convert.
    # echo "convert file tab to space! $newfilepath"
    sed -e "s/\t/    /g" "$newfilepath.tmp.md" > "$newfilepath"
    # tmp file delete
    rm "$newfilepath.tmp.md"
done

if [ ! "$err_files" == "" ]; then
    echo "-------------------------------"
    echo "Error file is Exist!"
    echo ""
    printf "$err_files"
    echo ""
    echo "-------------------------------"
else
    echo ""
    echo "success!"
    echo ""
fi