GNU coreutilsのmktempを試す

あるscriptを見ていたらmktempというコマンドを見かけました.GNU coreutilsの中の1つのようです.ユニークなテンポラリファイルやディレクトリが作成できるようです.

同じようなことをやるのにこれまではこんな感じで年月日やエポックにPIDを付けたりしてました><

$ TMP_FILE=`date +hoge-%F_%T-$$`
$ touch $TMP_FILE
$ ls -l $TMP_FILE
-rw-r--r-- 1 mk mk 0  2月 14 18:37 hoge-2016-02-14_18:36:59-13299
$ TMP_FILE=`date +hoge-%s-$$`
$ touch $TMP_FILE
$ ls -l $TMP_FILE
-rw-r--r-- 1 mk mk 0  2月 14 18:50 hoge-1455443448-13299

mktempの場合は規定値で10桁のランダムな文字が付くようです.更にファイル存在チェックもしているので衝突も起こらないという感じみたいです.

$ mktemp
/tmp/tmp.E66dzdpxMa
$ ls -l /tmp/tmp.E66dzdpxMa
-rw------- 1 mk mk 0  2月 14 18:25 /tmp/tmp.E66dzdpxMa

-dオプションでディレクトリが作成できます.

$ mktemp -d
/tmp/tmp.EFmqt7L0nY
$ ls -la /tmp/tmp.EFmqt7L0nY
合計 0
drwx------ 1 mk   mk      0  2月 14 18:27 .
drwxrwxrwt 1 root root 2920  2月 14 18:27 ..

ファイル名のテンプレートもカスタマイズできます.Xがランダム部になります.3文字以上無いと怒られます.
ランダム部のX部分が複数あると最後尾がランダムになるようです

$ mktemp XXX
zfG
$ mktemp XX
mktemp: テンプレート `hoge-XX' に含まれている X の数が少なすぎます
$ mktemp hoge-XXX
hoge-60h
$ mktemp hoge-XXXXXXXXXXXXXXXXXXXXXXXXXXXX
hoge-26CXkffROkyzwuUhej3Lza4KcdbC
$ mktemp XXX-XXX
XXX-m01
$ mktemp XXX-XXX-XXX
XXX-XXX-wqd

拡張子の指定は--suffixかテンプレートで指定できます.

$ mktemp --suffix=.log hoge-XXXX
hoge-LqWm.log
$ mktemp hoge-XXXX.log
hoge-lxtg.log

-uオプションでドライランです.でも存在チェックのタイミングがずれるのでこのファイル名を使うのは安全ではありません.

$ mktemp -u
/tmp/tmp.hdiPeJef1s
$ ls -l /tmp/tmp.hdiPeJef1s
ls: /tmp/tmp.hdiPeJef1s にアクセスできません: そのようなファイルやディレクトリはありません

-pオプションで作成されるディレクトリの変更が出来ます.(規定値は/tmp)
存在しないディレクトリを指定すると怒られるようです.

$ mktemp -p $HOME/tmp
/home/mk/tmp/tmp.dlx75Z6Wyn
$ mktemp -p `mktemp -u -d -p $HOME/tmp`
mktemp: テンプレート `/home/mk/tmp/tmp.jhGdkmp5SG/tmp.XXXXXXXXXX' からファイルを作成できません: そのようなファイルやディレクトリはありません

mktemp(3)もあるよう.

詳細はman mktemp, info mktempを.

しかしGNU coreutilsみたいな基本的なコマンドでさえ知らない使い方のわからないコマンドが結構あるのでダメですねorz
調べなければ……

$ dpkg -L coreutils | grep bin/
/usr/sbin/chroot
/usr/bin/hostid
/usr/bin/link
/usr/bin/printf
/usr/bin/truncate
/usr/bin/pr
/usr/bin/sha1sum
/usr/bin/nice
/usr/bin/tee
/usr/bin/realpath
/usr/bin/tac
/usr/bin/printenv
/usr/bin/arch
/usr/bin/logname
/usr/bin/sha384sum
/usr/bin/fold
/usr/bin/users
/usr/bin/yes
/usr/bin/paste
/usr/bin/factor
/usr/bin/pathchk
/usr/bin/basename
/usr/bin/dircolors
/usr/bin/du
/usr/bin/shuf
/usr/bin/sha224sum
/usr/bin/head
/usr/bin/tty
/usr/bin/join
/usr/bin/test
/usr/bin/runcon
/usr/bin/base64
/usr/bin/sha512sum
/usr/bin/id
/usr/bin/dirname
/usr/bin/numfmt
/usr/bin/nl
/usr/bin/install
/usr/bin/split
/usr/bin/od
/usr/bin/groups
/usr/bin/env
/usr/bin/tr
/usr/bin/comm
/usr/bin/md5sum
/usr/bin/nproc
/usr/bin/pinky
/usr/bin/uniq
/usr/bin/ptx
/usr/bin/sha256sum
/usr/bin/cksum
/usr/bin/who
/usr/bin/cut
/usr/bin/[
/usr/bin/csplit
/usr/bin/expand
/usr/bin/unexpand
/usr/bin/seq
/usr/bin/stdbuf
/usr/bin/unlink
/usr/bin/chcon
/usr/bin/timeout
/usr/bin/tsort
/usr/bin/expr
/usr/bin/stat
/usr/bin/tail
/usr/bin/mkfifo
/usr/bin/sort
/usr/bin/nohup
/usr/bin/fmt
/usr/bin/whoami
/usr/bin/sum
/usr/bin/wc
/usr/bin/shred
/bin/cp
/bin/dd
/bin/false
/bin/readlink
/bin/echo
/bin/vdir
/bin/mknod
/bin/rm
/bin/df
/bin/rmdir
/bin/sleep
/bin/true
/bin/date
/bin/stty
/bin/ln
/bin/mktemp
/bin/cat
/bin/ls
/bin/uname
/bin/chmod
/bin/touch
/bin/mv
/bin/sync
/bin/mkdir
/bin/dir
/bin/chgrp
/bin/chown
/bin/pwd
/usr/bin/md5sum.textutils

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)