これまで空ファイル生成に利用していたコマンドが実は思っていた挙動をしなかったことに気付いたので、その衝動でメモ。
空ファイルを生成する方法色々
せっかくなので調査したところ、下記のどれを使っても空ファイルは生成できることがわかった。
$ touch empty1.out
$ echo -n > empty2.out
$ > empty3.out
$ cat /dev/null > empty4.out
$ cp /dev/null empty5.out
$ :> empty6.out
といっても、3個目はプロンプトみたいでわかりづらいし、4,5個目は/dev/null
を書くのが面倒だから
使うとしたら1,2個目かなぁといった感じ。
(追記4/22) コメントで6番目を教えてもらいました。これを使うのも良さそう。
touch
は空ファイル生成コマンドではない
touch
はファイルが存在しないときに叩けば空ファイルになるけれど、既に存在するときには中身を空にしてくれない。
ここのところを常に空にしてくれると思っていた。この記事を書くきっかけコマンド。
下記に検証結果を残す。byte数を見るとtouch
のみ空になっていないことがわかる。
$ # byte数の確認
$ ls -l
-rw-r--r-- 1 jundoll staff 0 4 14 00:12 empty1.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:12 empty2.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:12 empty3.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:12 empty4.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:12 empty5.out
-rw-r--r-- 1 jundoll staff 0 4 22 17:02 empty6.out
$
$ # 各ファイルにファイル名を追記
$ for file in empty?.out; do
$ echo $file >> $file
$ done
$
$ # 上記の生成コマンドを再実行
$ touch empty1.out
$ echo -n > empty2.out
$ > empty3.out
$ cat /dev/null > empty4.out
$ cp /dev/null empty5.out
$ :> empty6.out
$
$ # byte数の確認
$ ls -l empty?.out
-rw-r--r-- 1 jundoll staff 11 4 14 00:14 empty1.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:14 empty2.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:14 empty3.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:14 empty4.out
-rw-r--r-- 1 jundoll staff 0 4 14 00:14 empty5.out
-rw-r--r-- 1 jundoll staff 0 4 22 17:03 empty6.out
$ rm -f empty?.out
echo > filename
もダメ
これも割と使ってたけれど、-n
を入れないと改行が1つ含まれた1byteのファイルが生成される。
細かいこと気にしないよって場合だったらこれでもOK。
$ echo > gomi.out
$ ls -l gomi.out
-rw-r--r-- 1 jundoll staff 1 4 14 00:20 gomi.out
(追記4/22) 明示的に上書きを記述したい場合は「|
」(pipe)を使う
こちらもコメントで教えていただきました。
set -C
でシェルのオプションを変更した場合には、リダイレクトによる上書きが禁止される。
その場合には、「>|
」でリダイレクトすることで明示的な上書きにできる。
$ set -C
$
$ # set -C 直後
$ echo -n > gome.out
-bash: gomi.out: cannot overwrite existing file
$
$ # |(pipe)を使う
$ echo -n >| gome.out
$ ls -l gomi.out
-rw-r--r-- 1 jundoll staff 1 4 22 17:06 gomi.out
オプションを変更されていることを想定するならば、「>|
」を使った方が良さそう。
まとめ
次で使い分けられる。
1.新規作成時のみ有効な、空ファイル作成方法
$ touch filename
2.上書き時にも有効な、空ファイル作成方法
$ echo -n >| filename
$ # or
$ :>| filename
(:>|
まで来ると違う言語みたい...。J
...。)