簡易バックコマンド cpbak.sh

LINEで送る
Pocket

設定ファイルやソースコードを修正する際、修正する前に設定ファイルのバックアップをみなさん取っていることと思います。 しかしバックアップを取る毎に、闇雲にbak2,bak3と名前を付加していくと、いつ修正を行ったのか分からなくなっていきます。

$ sudo cp /etc/XXX.conf /etc/XXX.conf.bak
$ sudo cp /etc/XXX.conf /etc/XXX.conf.bak2

例えば以下のようにバックアップファイル名に日付を入れる事により、いつ作業を行ったのか明確になり履歴の管理も楽になります。

$ sudo cp /etc/XXX.conf /etc/XXX.conf.20191001

しかし何度もファイルの変更を試みる場合は、日付の入力が少々面倒です。
そこで、[cpbah.sh ファイル名 or ディレクトリ名] と実行すると自動で日付を付加してくれるスクリプトを紹介したいと思います。

#!/bin/bash

if [ $# -lt 1 ]; then
	echo "Usage: $0 backupfile";
	exit -1;
fi

echo ""
echo " 1 : filename.sh -> filename.sh.YYMMDDHHMM (バックアップのファイル名を [元のファイル名 + 拡張子 + 日付] にしてバックアップする )"
echo " 2 : filename.sh -> filename.YYMMDDHHMM.sh (バックアップのファイル名を [元のファイル名 + 日付 + 拡張子] にしてバックアップする)"
echo " 3 : filename.sh -> /tmp/filename.YYMMDDHHMM.sh : バックアップのファイル名を [ /tmp/ + 元のファイル名 + 拡張子 + 日付] にしてバックアップする)"

echo ""
echo -n " 保存方法 : "
read SAVE_METHOD

# 1, 2, 3 以外の値が入力された場合は終了する。
if [ "${SAVE_METHOD}" -lt 1 ] || [ 3 -lt "${SAVE_METHOD}" ]; then
	echo "1 - 3 の値を入力して下さい。"
	exit -1;
fi

# 現在の日付を取得 YYMMDDHHMM 形式
# 秒も付加したい場合は%Sを追加する
BAKTIME=`date +'%y%m%d%H%M'`;
for FILENAME in "${@}"
do
	TMPFILENAME=''
	EXTENSION='';
	# 保存方法が1以外で、指定した値がファイルの場合
	if [ -f "${FILENAME}" ] && [ "${SAVE_METHOD}" -ne 1 ]; then
		# ファイルの拡張子を取得
		EXTENSION=`echo "${FILENAME}" |sed 's/^.*\.\([^\.]*\)$/\1/'`
		# 拡張子が存在しないファイルの場合
		if [ "${FILENAME}" == "${EXTENSION}" ]; then
			EXTENSION='';
			TMPFILENAME="${FILENAME}"
		# 拡張子が存在するファイルの場合
		else
			EXTENSION=".""${EXTENSION}";
			# ファイル名から拡張子を削除する
			TMPFILENAME=`echo "${FILENAME}" |sed 's/\.[^\.]*$//'`;
		fi
	# 保存方法が1 もしくは、指定した値がディレクトリの場合
	elif [ -d "${FILENAME}" ] || [ "${SAVE_METHOD}" -eq 1 ]; then
		# ディレクトリ名 (./dirname/) の末尾の / を削除する
		TMPFILENAME=`echo "${FILENAME}" |sed 's/\/$//'`
	fi
	# 指定した値がファイル or ディレクトリの場合
	if [ "${TMPFILENAME}" != "" ]; then
		if [ "${SAVE_METHOD}" -eq 3 ]; then
			# 最後のディレクトリ名を取得する
			TMPFILENAME=`basename "${TMPFILENAME}"`
			TMPFILENAME="/tmp/${TMPFILENAME}";
		fi
		# バックアップファイルを作成する
		echo cp -rp "${FILENAME}" "${TMPFILENAME}"."${BAKTIME}""${EXTENSION}";
		cp -rp "${FILENAME}" "${TMPFILENAME}"."${BAKTIME}""${EXTENSION}";
	fi
done

スクリプトを紹介する前に、ファイルのバックアップを取る場合の注意点を2点上げておきます。

  1. .php .sh など、拡張子によってシンタックスハイライトが有効になるエディタがあります。
    バックアップしたファイル名が filename.php.20171107 のような場合、ファイルを開いてもシンタクスハイライトが有効になりません。
  2. 設定ファイルによっては、ディレクトリ配下のファイルを全て有効にしてしまうディレクトリがあります。
/etc/apache2/apache2.conf
             :
IncludeOptional conf-enabled/*.conf
             :

や
/etc/cron.daily/ 配下のディレクトリ

など

※ シンタックスハイライト
テキストの可読性を向上させるため、プログラミング言語やマークアップ言語を異なる色やフォントで表示する機能。

よってこの2つのパターンを回避する為に、cpbak.sp コマンド実行時にどの方法でファイルを保存するのかを指定できるようにしました。
$ cpbak.sh filename.sh

 1 : filename.sh -> filename.sh.YYMMDDHHMM (バックアップのファイル名を [元のファイル名 + 拡張子 + 日付] にしてバックアップする )
 2 : filename.sh -> filename.YYMMDDHHMM.sh (バックアップのファイル名を [元のファイル名 + 日付 + 拡張子] にしてバックアップする)
 3 : filename.sh -> /tmp/filename.YYMMDDHHMM.sh : バックアップのファイル名を [ /tmp/ + 元のファイル名 + 拡張子 + 日付] にしてバックアップする)

 保存方法 : 1 <- 保存方法を選択
cp -rp filename.sh filename.sh.1909211844
$ ls
filename.sh filename.sh.1909211844

2 を選択した場合
cp -rp filename.sh filename.1909211844.sh
3 を選択した場合
cp -rp filename.sh /tmp/ filename.sh.1909211844
LINEで送る
Pocket

  • このエントリーをはてなブックマークに追加

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください