最近の更新

関連


その他いろいろ

多機能フィードリーダSynapse製作中

2月までは目が回るほど忙しい

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト

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