概要
期限切れのファイルを削除するようなスクリプトをテストするため、ファイルの作成日時を偽装する方法について調べた。まとめると下記の通り。
- 作成日時を偽装するには
touch -t 'YYYYMMDDhhmm' hoge.txt
- 作成日時を確認するには
- coretuils あり
ls -lt --time-style=long-iso
- coretuils なし
ls -lT
- coretuils あり
詳細
もっと具体的な例や、表示結果については以下に書く。
ファイル作成時間の偽装
touch
コマンドのオプション -t
を使えば過去または、未来の作成日時を持つファイルを作ることができる。使い方は下のコードを参照。man touch を見ればもっと詳しく書いてある。
.sh
# 1999年4月1日0時0分のファイル作成
touch -t '199904010000' hoge.txt
# 上と同じファイルを作成(年を2桁で書く)
# 但し、ルールが特殊(1969年〜2068年で解釈する)ので、使わないほうが良さそう。
touch -t '9904010000' hoge.txt
# 今年4月1日0時0分のファイル作成
touch -t '04010000' hoge.txt
ファイル作成日時の確認
確認する際は、ls
のオプションを使う。GNU ls と BSD ls でオプションが異なる。環境によって違うのでとりあえず両方試してみたら良いと思う。mac の場合はデフォルトでは BSD ls しか入ってないので GNU ls が使いたければ「homebrew でMacコマンドをLinuxのGNU風に置換する」を参考に coreutils をインストールすれば良い。
.sh
ls -lT
# -rw-r--r-- 1 user staff 0 4 1 00:00:00 1999 hoge.txt
ls -l --time-style=long-iso
# -rw-r--r-- 1 user staff 0 1999-04-01 00:00 hoge.txt
ファイル作成スクリプト
最後に、テストするための作ったスクリプトを載せておく。下のコードを実行すると、過去10日分の空ファイルを作成する。ここで使っている date -d は GNU のバージョンでないと利用できない。
.sh
for i in {0..9}
do
stamp=`date -d "$i days ago" +%m%d0000`
touch -t $stamp "hoges_$i.txt"
done
# ワンライナー版
for i in {0..9}; do touch -t `date -d "$i days ago" +%m%d0000` hoge_$i.txt; done