#!/bin/sh PATH=/usr/local/sqlite3/bin:$PATH if [ -z "$2" ]; then # $2=DBファイル がなければUsageを出して終了 cat<<-EOF >&2 Usage: $0 SUBcommand SQLarchive [ Files... ] SUBcommands are as follows: a Add Files... to SQLarchive. d Delete Files... from SQLarchive. l List files in SQLarchive. x Extract files from SQLarchive. EOF exit 1 fi cmd=$1; shift # 第1引数はサブコマンド db=$1; shift # 第2引数はDBファイル query() { sqlite3 $db "$@" } mtime() { # ファイルの修正時刻を touch -t の書式に変換する perl<<-EOF use POSIX "strftime"; use File::stat; print strftime "%Y%m%d%H%M.%S", localtime(stat("$1")->mtime); EOF } hexize() { perl -ne 'print unpack("H*", $_)' } unhexize() { perl -n -e 's/([0-9a-f]{2})/print chr hex $1/gie' } query<&2 continue fi mt=`mtime $f` fn=`echo "$f" | sed "s/'/''/g"` # ファイル名のクォートをクォート query<<-EOF REPLACE INTO files VALUES( '$fn', '$mt', X'`hexize < $f`'); EOF done } delfiles() { # ファイル削除 for f; do fn=`echo "$f" | sed "s/'/''/g"` # ファイル名のクォートをクォート echo "DELETE FROM files WHERE filename='$fn';" done | query } listfiles() { # 格納ファイル一覧 query<<-EOF .mode column .head on SELECT filename, mtime, length(data) size FROM files ORDER BY filename; EOF } extractfiles() { # ファイル抽出(絶対パスは相対パスに変換) for f; do fn=`echo "$f" | sed "s/'/''/g"` # クォートをクォート cond="WHERE filename='$fn'" outfile=`echo "$f" | sed 's,^//*,,'` # 先頭からの / を除去 dir=`dirname $outfile` test -d $dir || mkdir -p $dir query "SELECT hex(data) FROM files $cond;" \ | unhexize > $outfile touch -t `query "SELECT mtime FROM files $cond;"` $outfile done } case $cmd in a) addfiles "$@" ;; d) delfiles "$@" ;; l) listfiles ;; x) extractfiles "$@" ;; esac