シェルプログラミング - ダミーのファイルを作りたい
環境:macOS Monterey version 12.6.1
$ bash -version | head -n 1
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)
何らかの理由で、大量のファイルを作成したい場合があります。
大抵は、touchを使って作りるのがいいと思います。
touch 001.txt
大量に作る場合は、以下のようにしてコマンドラインにペーストすればOKです。
touch 001.txt
touch 002.txt
touch 003.txt
touch 004.txt
touch 005.txt
作成時刻を指定してファイルを作成することもできます。
「2022-01-01 00:00」 でファイルを作成しました。
$ touch -h
usage: touch [-A [-][[hh]mm]SS] [-achm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]]
[-d YYYY-MM-DDThh:mm:SS[.frac][tz]] file ...
$ touch -t 202201010000 sample.txt
$ ls -al sample.txt
-rw-r--r-- 1 user1 staff 0 1 1 2022 sample.txt
補足ですが、
この時に指定した時刻は…以下のようになりました。
ctimeだけ現在の日時になりますが、mtime,atimeは指定した日時になります。
mtime : 変更日時
atime : アクセス日時
ctime : 属性の変更日時
$ touch -t 202201010000 sample.txt
$ ls -al sample.txt
-rw-r--r-- 1 user1 staff 0 1 1 2022 sample.txt
$ ls -cl sample.txt
-rw-r--r-- 1 user1 staff 0 11 19 17:49 sample.txt
$ ls -ml sample.txt
-rw-r--r-- 1 user1 staff 0 1 1 2022 sample.txt
大抵は一度作成すればたりるのでここまでわかれば大丈夫そうです。
後やりたいことは….
ファイル名やファイルの作成時刻を変えながら多数のファイルを作成したい。
Shellでやろうとすると、時刻計算が…
なので、EXCELとかでtouchコマンドを整形してしまうのが早いと思います。
が…
少し考えます。
# 2022-03-03 00:00 でファイルを作成
CDATE=202203030000
touch -t ${CDATE} sample03.tmp
こっちの方がわかりやすいかな
touch -d 2022-04-04T00:00:00 sample04.tmp
シェルにすると
CDATE=2022-04-04T00:00:00
touch -d ${CDATE} sample04.tmp
現在の日時は
CDATE=`date`
echo ${CDATE} # 2022年 11月19日 土曜日 18時16分16秒 JST
日時をフォーマットして出力
CDATE=`date +%Y-%m-%dT%H:%M:%S`
echo ${CDATE} # 2022-11-20T18:37:35
日時の計算
… あれっ…以下のコード動かない…
$ date --date "-1 month"
動いたら…以下のようなイメージだったのですが…
1ヶ月後の日付は以下のように取得できたのですが…
CDATE=`date --date "-1 month" "+%Y%m%d"`
シェルの種類によって違うんだな…
-1 yearm -1 month -1 dayとかで指定したような気もしたのですが…
バージョン違いによるものなんでしょうか?
ヘルプを表示してオプションを調べます。
以下は、1年2ヶ月と3日後の日付を取得しています。
CDATE=`date -v-1y -v-2m -v-3d '+%Y/%m/%d (%a)'`
echo ${CDATE}
5日前までの日付を取得する
for i in `seq 1 5`
do
# CDATE=`date -v-1d '+%Y-%m-%d %h:%M'` # 022-11-19 11:12
# CDATE=`date -v-1d '+%Y-%m-%d %H:%M'` # 022-11-19 23:12
# CDATE=`date -v-${i}d '+%Y-%m-%dT%H:%M'` # 2022-11-19T23:17
CDATE=`date -v-${i}d '+%Y-%m-%dT00:00'` # 時刻は00:00にする
echo ${CDATE}
done
----- OUTPUT -----
2022-11-19T00:00
2022-11-18T00:00
2022-11-17T00:00
2022-11-16T00:00
2022-11-15T00:00
5前から今日までの日付のファイルを作成
やっとやりたかったことができた。
# 2022-02-03 00:00 でファイルを作成
# CDATE=2022-04-04T00:00:00
# touch -d ${CDATE} sample04.tmp
# 日付を保存 Linux系のbashの場合
# CDATE=`date`
# CDATE=`date --date "-1 month" "+%Y%m%d"`
# CDATE=`date +%Y-%m-%dT%H:%M:%S`
# echo ${CDATE}
# sample001.tmp から sample005.tmpのファイルを作成
for i in `seq 1 5`
do
# CDATE=`date -v-1d '+%Y-%m-%d %h:%M'` # 022-11-19 11:12
# CDATE=`date -v-1d '+%Y-%m-%d %H:%M'` # 022-11-19 23:12
# CDATE=`date -v-${i}d '+%Y-%m-%dT%H:%M'` # 2022-11-19T23:17
CDATE=`date -v-${i}d '+%Y-%m-%dT00:00:00'` # 時刻は00:00にする
echo ${CDATE}
WK_NUM=$(printf "%03d\n" "${i}") # 0 -> 000にする
touch -d ${CDATE} sample${WK_NUM}.tmp
done
$ ls -al *00*.tmp
-rw-r--r-- 1 user1 staff 0 11 19 00:00 sample001.tmp
-rw-r--r-- 1 user1 staff 0 11 18 00:00 sample002.tmp
-rw-r--r-- 1 user1 staff 0 11 17 00:00 sample003.tmp
-rw-r--r-- 1 user1 staff 0 11 16 00:00 sample004.tmp
-rw-r--r-- 1 user1 staff 0 11 15 00:00 sample005.tmp
よく考えたらファイル名を日付にするとわかりやすいので修正します。
for i in `seq 1 5`
do
# CDATE=`date -v-1d '+%Y-%m-%d %h:%M'` # 022-11-19 11:12
# CDATE=`date -v-1d '+%Y-%m-%d %H:%M'` # 022-11-19 23:12
# CDATE=`date -v-${i}d '+%Y-%m-%dT%H:%M'` # 2022-11-19T23:17
CDATE=`date -v-${i}d '+%Y-%m-%dT00:00:00'` # 時刻は00:00にする
FILENAME=`date -v-${i}d '+%Y%m%d'` #
#echo ${CDATE}
# WK_NUM=$(printf "%03d\n" "${i}") # 0 -> 000にする
touch -d ${CDATE} ${FILENAME}_sample.wk
done
$ ls -alT *.wk
-rw-r--r-- 1 user1 staff 0 11 15 00:00:00 2022 20221115_sample.wk
-rw-r--r-- 1 user1 staff 0 11 16 00:00:00 2022 20221116_sample.wk
-rw-r--r-- 1 user1 staff 0 11 17 00:00:00 2022 20221117_sample.wk
-rw-r--r-- 1 user1 staff 0 11 18 00:00:00 2022 20221118_sample.wk
-rw-r--r-- 1 user1 staff 0 11 19 00:00:00 2022 20221119_sample.wk