17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

bashで空ファイルを生成

Last updated at Posted at 2018-04-18

これまで空ファイル生成に利用していたコマンドが実は思っていた挙動をしなかったことに気付いたので、その衝動でメモ。

空ファイルを生成する方法色々

せっかくなので調査したところ、下記のどれを使っても空ファイルは生成できることがわかった。

$ 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...。)

17
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?