Robocopyのログのサマリー部分を整形してみる

Robocopyのログのサマリー部分が見づらいので、整形してみました。

スクリプト名は、logreport.sh です(適当に直して下さい)。

#!/bin/sh

<< COMMENTOUT

2019/09/04作成

robocopyログファイル(Windows2016版)のサマリー部分の整形スクリプト
フォルダ"log"内のrobocopy*.logをUTF-8に変換し、"report"フォルダにサマリー部分を出力します
要 nkf

処理前のlogの最終部分
  ------------------------------------------------------------------------------

                       合計        コピー済み       スキップ       不一致        失敗    Extras
     ディレクトリ:        18571            0      18571         0         0         0
       ファイル:       157425       152728       4697         0         0         0
        バイト: 299399096023 292980525070 6418570953         0         0         0
         時刻:      0:15:20      0:10:48                        0:00:00   0:04:32


         速度:              451855700 バイト/秒
         速度:              25855.390 MB/分
     終了: 2019年xx月xx日 xx:xx:xx

処理後のlog
  ------------------------------------------------------------------------------

                    Total       Copied    Skipped  Mismatch    FAILED    Extras
     Dirs :         18571            0      18571         0         0         0
    Files :        157425       152728       4697         0         0         0
    Bytes :  299399096023 292980525070 6418570953         0         0         0
    Times :       0:15:20      0:10:48                        0:00:00   0:04:32


         速度:              451855700 バイト/秒
         速度:              25855.390 MB/分
     終了: 2019年xx月xx日 xx:xx6:xx

使い方
 カレントディレクトリに"log"というフォルダを作り、robocopyのログファイルを格納します
 カレントディレクトリに"report"というフォルダを作っておきます
 WSLを起動し、カレントディレクトリに移動します
 ./logreport.sh をキックします


※もともとは Powershell で作りましたが、
 処理ファイル数が多いと不安定になるようなので、
 シェルスクリプトで作り直しました

※事前に、WSLにnkfをインストールしておいて下さい

COMMENTOUT

tmpfile=$(mktemp)
tmpfile2=$(mktemp)
tmpfile3=$(mktemp)

# ログファイルの文字コードを UTF-8 にする
cd log
echo ログファイルをUTF-8化しています...
find . -name 'robocopy*.log' -type f -print0 | xargs -0 nkf -u -Lu --overwrite -w 

# ログファイルの最後の15行目を取り出し、
# ----------で始まる行以降を取り出し(ファイルが短くて-----が2行入ってしまった場合は2番目以降)
# サマリー行の全角文字を半角文字に変換する
echo ログファイルを整形出力します
for fname in `find ./robocopy*.log`
do
        echo $fname
        # 各ログファイルの末尾15行を取り出す
        tail -15 $fname > $tmpfile
        if [ `grep -c '^----------' $tmpfile` -eq 2 ] ; then
                # ^---------- が2行ある場合は、最初の行を潰す
                sed '0,/^----------/ s/^----------/xxx/' $tmpfile > $tmpfile3
                # ^---------- 以降を出力
                fname1=${fname#.\/robocopy_}
                echo ${fname1%.log} > $tmpfile2
                sed -n '/^----------/,$p' $tmpfile3 >> $tmpfile2
                rm $tmpfile3
        else
                # ^---------- 以降を出力
                fname1=${fname#.\/robocopy_}
                echo ${fname1%.log} > $tmpfile2
                sed -n '/^----------/,$p' $tmpfile >> $tmpfile2
        fi
        # サマリーの全角を半角に変換
        sed -e 's/^   ディレクトリ:/   Dirs : /g' \
            -e 's/^     ファイル:/  Files : /g' \
            -e 's/^      バイト:/  Bytes : /g' \
            -e 's/^       時刻:/  Times : /g' \
            -e 's/   合計/Total/g' \
            -e 's/ コピー済み/Copied/g' \
            -e 's/   スキップ/Skipped/g' \
            -e 's/     不一致/Mismatch/g' \
            -e 's/    失敗/FAILED/g' \
            $tmpfile2  > ../report/$fname
        done
rm $tmpfile
rm $tmpfile2

以上です。