Bash scripts
Bash/Zsh向けのシェルスクリプト
初出:2008年11/09 更新:2008年12/13
VisualStudio (C#, C++) のプロジェクトを丸々バックアップ
タイムスタンプをつけてプロジェクトのソースコード(/binや/obj以外)をtar.bz2で圧縮。保存先はカレントディレクトリかenv BACKUP_PROJ_PATH
#!/bin/sh
# usage: backup cpp|cs dir_name
# env: BACKUP_PROJ_PATH
dir_name=${2/\\/} # remove terminating /
case "$1" in
"cpp")
FL=`find "$dir_name" -type f | grep -vE "/Debug/?" | grep -v ".ncb$"`
;;
"cs")
FL=`find "$dir_name" -type f | grep -vE "/(bin|obj)/?"`
;;
esac
if [ "$BACKUP_PROJ_PATH" = "" ]; then BACKUP_PROJ_PATH="."; fi
BACKUP_PROJ_PATH=${BACKUP_PROJ_PATH%/}
for f in $FL; do echo $f; done
echo "OK? [Y/n]"
read p
if [ "$p" != "n" ]; then
filename=$BACKUP_PROJ_PATH/${dir_name}_$(date +%Y%m%d-%H%M).tar.bz2
echo "$FL" | tar jcvf "$filename" --files-from=-
echo
echo $filename
fi
ついでに忘れないようにメモ。tarでパイプから圧縮すべきファイル名を受け取る時は--files-from=-とする。
年/月/日/* 構造のディレクトリを 年/月/日.tar として(非圧縮)tarする
日ごとに溜まっていくログや自動処理の結果、写真などをCD/DVDに焼いて保存するとき、ファイル名の長さがどうとか文字がどうとかうるさいので、tarして誤魔化すスクリプト。
全部一つのアーカイブにするとファイルが壊れたときに損害が大きいため一日単位でまとめます。 日付はYYYY/MM/DD形式のみ対応。
tarは文字コードのことを特に考えてくれません。作ったのと同じ環境で展開しないとファイル名が文字化けします。
#!/bin/sh
# -*- coding: utf-8 -*-
# tree_archive.sh
# 20081213 v1.00 7bit
#
# usage:
# tree_archive.sh [-v] SRC_DIR BACKUP_DIR FROM_DATE [TO_DATE]
#
# 2008/12/{01,02,03}/{a,b,c} のような構造のディレクトリを
# 2008/12/{01,02,03}.tarのように日ごとにまとめてtar
# DATEは2008, 2008-12, 2008-07-23の何れかの書式。省略した場合はFROMは範囲の先頭、TOは末尾として扱う。
# -v で処理過程を表示
v=0
if [ "$1" = "-v" ]; then
v=1
shift 1
fi
if [ "$#" -lt 3 ]; then echo "tree_archive.sh [-v] SRC_DIR BACKUP_DIR FROM_DATE [TO_DATE]"; exit 1; fi
SRC_DIR=$1
BACKUP_DIR=$2
FROM_DATE=$3
if [ "$#" -ge 2 ]; then TO_DATE=$4; else TO_DATE=$(date +%Y-%m-%d); fi
# 年月日を切り出し
YEAR_FROM=$(echo $FROM_DATE|cut -f 1 -d '-')
YEAR_TO=$(echo $TO_DATE|cut -f 1 -d '-')
MONTH_FROM=$(echo $FROM_DATE|cut -f 2 -d '-')
MONTH_TO=$(echo $TO_DATE|cut -f 2 -d '-')
DAY_FROM=$(echo $FROM_DATE|cut -f 3 -d '-')
DAY_TO=$(echo $TO_DATE|cut -f 3 -d '-')
function verbose() {
if [ "$v" -eq 1 ]; then echo $*; fi
}
verbose "$YEAR_FROM-$MONTH_FROM-$DAY_FROM から $YEAR_TO-$MONTH_TO-$DAY_TO のバックアップ"
verbose "バックアップ元: $SRC_DIR"
verbose "バックアップ先: $BACKUP_DIR"
# 停止
trap 'echo "canceled."; exit 1;' 2
# ------- 年
for year in $(seq $YEAR_FROM $YEAR_TO); do
iter_month_from="01"
iter_month_to="12"
# 最初の年は指定された月以降
if [ "$year" -eq "$YEAR_FROM" ]; then iter_month_from=$MONTH_FROM; fi
# 最後の年は指定された月まで
if [ "$year" -eq "$YEAR_TO" ]; then iter_month_to=$MONTH_TO; fi
# ------- 月
for month in $(seq $iter_month_from $iter_month_to); do
iter_day_from="01"
iter_day_to="31"
# 最初の年・月は指定された日以降
if [ "$year" -eq "$YEAR_FROM" -a "$month" -eq "$MONTH_FROM" ]; then iter_day_from=$DAY_FROM; fi
# 最後の年・月は指定された日まで
if [ "$year" -eq "$YEAR_TO" -a "$month" -eq "$MONTH_TO" ]; then iter_day_to=$DAY_TO; fi
# ------- 日
for day in $(seq $iter_day_from $iter_day_to); do
# パス生成、存在すれば処理
fromdir=$SRC_DIR$(printf '/%02d/%02d/%02d' $year $month $day)
todir=$BACKUP_DIR$(printf '/%02d/%02d' $year $month)
tofile=$todir$(printf '/%02d.tar' $day)
if [ -d "$fromdir" ]; then
mkdir -p $todir
cd $fromdir;
tar cf "$tofile" .
verbose "$year-$month-$day"
fi
done
done
done
