ちょっとしたtipでも「ヘーッ」と思う人もいるようなので書いてみます。Unix/Linux/Cygwin/MSYSとかでの話。
ファイル名の一部に日付や時刻を入れたいときはけっこうあります。次のようにします。
これで、2008-11-29.txt (このエントリーを書いている時点での「今日」)という名のファイルができます。
$ touch `date +%Y-%m-%d`.txt
dateコマンドの+オプションで、表示する日付・時刻のフォーマットを指定できるのです。パーセントの後の1文字は次のような意味です。
文字 | 意味 | 例 |
---|---|---|
Y | 4桁の年 | 2008 |
y | 2桁の年 | 08 |
m | 2桁の月 | 01, 11 |
d | 2桁の日 | 01, 29 |
H | 24時制2桁の時間 | 01, 14 |
M | 2桁の分 | 01, 59 |
S | 2桁の秒 | 01, 59 |
A | 曜日 | Saturday |
a | 曜日(省略形) | Sat |
曜日の表示はロケールに依存します。それと、%nで改行、%%でパーセント記号そのものです。ちょっと実験:
$ date '+%Y-%m-%d (%a)%n%H:%M:%S'
2008-11-29 (Sat)
10:22:19
$
メモを書くために、日付・時刻を含むファイルを作り、さらにそのファイルの先頭に日付・時刻を書き込む例は:
$ date '+%Y-%m-%d (%a) %H:%M:%S%n' > memo_`date +%y-%m-%d_%H-%M-%S`.txt
$ cat memo_08-11-29_10-23-18.txt
2008-11-29 (Sat) 10:23:18$
もう少し実用的な例として、「パッチの作り方と当て方はこうするもんね」で紹介したパッチ(差分)を作るコマンドラインをシェルスクリプトにしてみます。
#!/bin/sh
# Name: make-diff[ -z "$1" ] && eval 'echo "Usage: $0 file-or-directory-name"; exit 1'
TODAY=`date +%Y%m%d`
[ -f "$1" ] && [ -f "$1.orig" ] && eval 'diff -u "$1.orig" "$1" > "$1.$TODAY.diff"; exit 0'
[ -d "$1" ] && [ -d "$1.orig" ] && eval 'diff -Naru "$1.orig" "$1" > "$1.$TODAY.diff"; exit 0'echo "$1 and $1.orig must be existing files or directories."; exit 1
- セミコロンの打ち所を間違うので、ifは使いませんでした :-)
- '['(testコマンド)と']'のなかに入っているハイフンナンチャラの説明はコチラ。
- 複数のコマンドを1個のコマンドのように扱いたくて、シェル関数を書くほどのことでもないなら eval が便利。丸括弧で囲んで
(echo "Usage: $0 file-or-directory-name"; exit 1)
だと、exitが無意味になります。 - ファイル名を二重引用符で囲んでいるのは、空白を含むファイル名を想定してです*1。
*1:引用符が余計なお世話になってしまう事態も稀にあります。