ファイルサイズを指定してファイルを作る方法

ファイルサイズを指定してファイルを作る場合はWebツールでbyte計算をしながら作ると楽(掛け算が辛いので)。
参考 : [バイト換算 - 高精度計算サイト](https://keisan.casio.jp/exec/user/1355670543)

# ファイルの中身がなんでもいい場合
## Windowsの場合
- 環境 : Windows10 Pro バージョン1903
- 参考 : [Windows 10対応：巨大サイズのファイルを簡単に作る（fsutilコマンド編）：Tech TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/0209/28/news002.html)

ファイルサイズのチェック処理をテストする時にきっちりサイズのファイルが欲しい。
中身がなんでもいい場合に使えます。

fsutilはWindowsコマンドなのでGitBashなどコマンドプロンプト以外を使うと文字化けする。
[それが嫌な場合は.bash_profileなどで対策できる。](https://qiita.com/ponsuke0531/items/c22f1c2fde3e7de289b6#%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E5%AF%BE%E7%AD%96)が、文字化けしても使える。

```bash:作り方
# ファイルサイズはbyte数で指定
$ fsutil file createnew {ファイル名} {ファイルサイズ}
```

```bash:10Mのファイルサイズチェックを境界値テストするためのファイルを作る
# 10M-1byteのGIFファイルを作る
$ fsutil file createnew sample10m_under.gif 10485759
ファイル C:\path\to\sample10m_under.gif が作成されました
# 10MのPDFファイルを作る
$ fsutil file createnew sample10m.pdf 10485760
ファイル C:\path\to\sample10m.pdf が作成されました
# 10M+1byteのPNGファイルを作る
$ fsutil file createnew sample10m_over.png 10485761
ファイル C:\path\to\sample10m_over.png が作成されました
# できた
$ ls -la | grep sample10m
-rw-r--r-- 1 ponsuke 197609 10485760 9月  25 20:02 sample10m.pdf
-rw-r--r-- 1 ponsuke 197609 10485761 9月  25 20:02 sample10m_over.png
-rw-r--r-- 1 ponsuke 197609 10485759 9月  25 20:01 sample10m_under.gif
```

## Macの場合
- 環境 : macOS Catalina バージョン10.15.6
- 参考 : [mkfileコマンド - Qiita](https://qiita.com/fantm21/items/656c1c937d5641b2d6b4)

```bash:作り方
# ファイルサイズは、b(ブロック数) / k(KB) / m(MB) / g(GB)の単位をつけて指定
$ mkfile {サイズ} {ファイル名}
```

```bash:いろんなサイズで作ってみる
# bはbyteではないので注意が必要
% mkfile 10b sample10b.pdf
# 他の単位はわかりやすい
% mkfile 10k sample10k.gif
% mkfile 10m sample10m.jpg
# できた
% ls -la | grep sample10
-rw-------@  1 ponsuke  staff      5120  9 25 20:37 sample10b.pdf
-rw-------@  1 ponsuke  staff     10240  9 25 20:37 sample10k.gif
-rw-------@  1 ponsuke  staff  10485760  9 25 20:38 sample10m.jpg
```

## Ubuntuの場合
- 環境
    - Ubuntu 20.04 LTS
    - dd (coreutils) 8.30
    - fallocate from util-linux 2.34
    - head (GNU coreutils) 8.30
- 参考 : [すぐ忘れてしまう、仕事で使う技 - Qiita](https://qiita.com/hana_shin/items/53c3c78525c9c758ae7c)

```bash:作り方
# サイズには単位を指定できる
$ dd if={コピー元のファイルとか標準入力} of={ファイル名} bs={コピー1回のサイズ} count={コピー回数}
$ fallocate -l {ファイルサイズ} {ファイル名}
# {出力元となるファイルや標準入力}から{出力サイズ}分{ファイル名}に出力する
$ head -c {出力サイズ} {出力元となるファイルや標準入力} > {ファイル名}
```

```bash
# ddの場合------------------------------------------------------------------
# サイズの単位は「M」を指定した場合と
$ dd if=/dev/zero of=sample10m.png bs=10M count=1
1+0 records in
1+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.013019 s, 805 MB/s
# 「MB」を指定した場合では
$ dd if=/dev/zero of=sample10m.pdf bs=10MB count=1
1+0 records in
1+0 records out
10000000 bytes (10 MB, 9.5 MiB) copied, 0.0118475 s, 844 MB/s
# サイズが違うので注意が必要
$ ls -la sample10m.p*
-rw-rw-r-- 1 ubuntu ubuntu 10000000 Sep 25 13:42 sample10m.pdf
-rw-rw-r-- 1 ubuntu ubuntu 10485760 Sep 25 13:42 sample10m.png
# よく分からなくなったらmanで確認する
$ man dd | grep M | grep B
       N and BYTES may be followed by the following multiplicative suffixes: c =1, w =2, b =512, kB =1000, K  =1024,  MB  =1000*1000,  M
       =1024*1024, xM =M, GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

# fallocateの場合------------------------------------------------------------------
# ファイルサイズの単位に「K」を指定した場合と
$ fallocate -l 1K sample1k.tiff
# 「KB」を指定した場合では
$ fallocate -l 1KB sample1k.gif
# サイズが違うので注意が必要
$ ls -la sample1k.*
-rw-rw-r-- 1 ubuntu ubuntu 1000 Sep 25 14:08 sample1k.gif
-rw-rw-r-- 1 ubuntu ubuntu 1024 Sep 25 14:08 sample1k.tiff

# headの場合------------------------------------------------------------------
$ head -c 10G /dev/zero > sample10g.bmp
$ head -c 10GB /dev/zero > sample10g.pdf
$ ls -la sample10g.*
-rw-rw-r-- 1 ubuntu ubuntu 10737418240 Sep 25 14:28 sample10g.bmp
-rw-rw-r-- 1 ubuntu ubuntu 10000000000 Sep 25 14:33 sample10g.pdf
```