rsync を安全で便利に使うために、

  • どのファイルがコピーされるかを事前に出力し、コピーしてよいか確認する
    • 間違って上書きしたり別の場所に rsync しようとしていたときに気づける
    • source/target の差分チェックを走らせる必要があるので、ある程度の時間はかかってしまうが、間違った場所へコピーを始めてしまうリスクを考えると全然お得
    • これをするには -nv オプションを付けると良いのだが、毎回付けるのが億劫
  • -h --info=progress2 をつけて実行する
    • コピーの速度と進捗を表示するので、コピーに時間が思ったよりかかりそうなときに気づける
    • これらは付けてほぼ損がないオプションなので常につけてしまえばよい

ようにしたいと思ったことがないだろうか。自分はよくある。

というわけでそれをやってくれる簡単なラッパスクリプトを書いた。
以下のスクリプトを ssync (safe rsync という意味で命名) という名前で保存して、rsync の代わりに実行するとよい。

#!/bin/bash
 
if [[ $1 == -V ]]; then
    # If the first option is -V, skip showing the file list
    shift
else
    ASKCOPY=1
fi
 
if [[ -n "$ASKCOPY" ]]; then
    printf "\033[34m"
    rsync -vnh $@
    printf "\033[0m"
fi
 
command="rsync -h --info=progress2 $@"
announce="Commencing \`${command}\`"
 
cols=$(tput cols 2>/dev/null)
if [[ $? != 0 ]]; then
    # tput failed somehow
    cols=80
else
    announce_len=${#announce}
    cols=$((cols<announce_len ? cols : announce_len))
fi
 
sep=$(for ((i=1; i<=cols; i++)); do printf "-"; done)
 
echo ""
echo $sep
echo $announce
echo $sep
 
if [[ -n "$ASKCOPY" ]]; then
    echo ""
    read -n1 -p "ok? (y/N): " answer
 
    if [[ "$answer" != [yY] ]]; then
        echo ""
        echo "Aborted"
        exit 1
    fi
fi
 
echo ""
echo "Running..."
$command
echo "Done."

このコマンドを何度も使っていると、実行するかを毎回聞かれるのが面倒になることもある。そういう時は、 ssync の部分を rsync に置き換えるか、ssync -V ... のように最初のオプションとして -V をつけることで確認をスキップできる。