torikatsu.dev

Flutterとかプログラミングとかガジェットとか書きます

【zsh】空ファイルを作る3つの方法

この記事はUnipos Advent Calender 2021、11日目の記事です。

お久しぶりです。とりかつ(@torikatsu923)です。

開発作業をしていると空ファイルを作成したい時がしばしばあります。

新しいファイルにプログラムを書きたい、とりあえずメモを取りたい、、、

エンジニアの皆さんはターミナルから空ファイルを作成することが多いと思います。 ターミナルを使用した空ファイルの作成方法には複数あります。 今回の記事は空ファイルの作成方法とそれぞれの特徴について紹介していこうと思います。

空ファイル作成コマンド一覧

空ファイルを作成するコマンドをざっと5つぐらい上げてみました。

  • touch foo
  • cp /dev/null foo
  • cat /dev/null > foo
  • echo -n > foo
  • :> foo

空ファイルの作成方法はいろいろな記事で紹介されています。それらを大きく以下の3つに分類することができます。

  1. 無をリダイレクト(>)する
  2. touchコマンドを使用する
  3. 0byteのファイルをコピーする

無をリダイレクト(>)する

この方法はなんらかの方法で0byteの出力を得て、それをリダイレクトすることで空ファイルを作成する方法です。この方法の強みはタイプ数が最も少なくなることです。

0byteの出力を得る方法はいろいろあります。

echoで改行を表示しない方法や、、

$ echo -n

無をcatする方法、、、

$ cat /dev/null

その中でも最もタイプ数が短いのは:を使う方法です。

$ :

これだけで無を得ることができます。:という演算子がありこれは何もしません。 実際にバイト数を測ってみると0でした。

$ : | wc -c
       0

空ファイルを作成する際はこれをリダイレクトするだけなのでファイル名を除けば2キーストロークで完結します。

:>ファイル名

短くて最高ですね!!

touchコマンドを使用する

touchコマンドによってファイルを作成することができます。この方法は馴染みが深い方法だと思います。 touchの強みは以下のように複数のファイルを一気に作成できることです。

$ touch foo.txt bar.txt

$ ls
bar.txt foo.txt

また、touchはファイルが存在しなければファイルを作成し、ファイルが存在すれば更新日時を最新にしてくれます。リダイレクトはファイルが存在する場合は失敗するだけなので使い分けができそうですね。

~/Desktop/touch_test
❯ ls1 
bar.txt foo.txt

~/Desktop/touch_test
❯ :>bar.txt
zsh: file exists: bar.txt

touchを激推ししましたが、実はteeを使うことで複数のファイルを一気に作ることもできます...

$ : | tee a b c 

touchよりこっちのがタイプ数すくなくてええやん

0byteのファイルをコピーする

以下のようにあらかじめ0byteのファイルを用意しておいてコピーする方法です。

$ cp 0バイトのファイル foo

0byteのファイルを常に準備する手間がかかってしまうため、/dev/nullを使う方法がいいかなと思います

$ cp /dev/null foo

cpには強制的に上書きする-fオプションがあります。これを組み合わせると初期化処理で活躍しそうです。

~/Desktop/touch_test
❯ seq 5 >> bar.txt

~/Desktop/touch_test
❯ cat bar.txt
1
2
3
4
5

~/Desktop/touch_test
❯ yes | cp -f /dev/null bar.txt
overwrite bar.txt? (y/n [n]) 

~/Desktop/touch_test
❯ cat bar.txt

おわりに

今回は様々な空ファイル作成方法について紹介しました。 特に:>はめちゃめちゃ便利で、記号のみで構成されているところに非常に強い趣を感じることができます()

今回紹介した方法以外にも空ファイルを作成する方法は様々あると思うので、もしアイデアがあればコメント等いただけるととても嬉しいです!