いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

指定サイズで中身がゼロ(\0)のファイルを作る (bash)

概要

小ネタ。よく忘れるのでメモメモ。

開発時に特定のバイナリファイルを扱うようなときがあって、たまに中身がオールゼロ(\0, NULL文字) のデータがほしいときがたまーにあります。

そういうときに、大抵は dd コマンドを使って作ったりすることが多いと思いますが、dd コマンドって注意して使わないと、とんでもないサイズのファイルを作ったりするので、あまり好きではないです。。w (bsの指定忘れたりすると、全部食い尽くすファイルが生成されたり)

お手軽に作れる方法があって、head コマンドと /dev/zero が使えます。こんな感じ。

$ head -c 100 /dev/zero > zero.bin

これで、サイズが 100バイト で中身がオールゼロのデータになります。

dd コマンドだと以下のようになりますね。

$ dd if=/dev/zero of=zero.bin bs=100 count=1 2>/dev/null

サンプル

以下、head コマンドを利用したサンプルです。

#!/usr/bin/env bash

basedirpath=/tmp/try-linux/zerobinary

rm -rf "${basedirpath}"
mkdir -p "${basedirpath}"

## 指定したサイズで中身が \0 のデータのファイルを作る
#
head -c 1024 /dev/zero > "${basedirpath}/zero.bin"

# 確認
echo '----------------------------------------------'
ls -l "${basedirpath}/zero.bin"
hexdump "${basedirpath}/zero.bin"

## 中身を \1 のデータのファイルを作る
#
head -c 1024 /dev/zero | tr '\0' '\1' > "${basedirpath}/one.bin"

# 確認
echo '----------------------------------------------'
ls -l "${basedirpath}/one.bin"
hexdump "${basedirpath}/one.bin"

実行すると以下のようになります。

gitpod /workspace/try-linux $ make

ENTER EXAMPLE NAME: zerobinary_head

[INPUT ] zerobinary_head
[TARGET] zerobinary_head
[SCRIPT] basic/zerobinary/zerobinary_head.sh

===== START [basic/zerobinary/zerobinary_head.sh] =====
----------------------------------------------
-rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:43 /tmp/try-linux/zerobinary/zero.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000400
----------------------------------------------
-rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:43 /tmp/try-linux/zerobinary/one.bin
0000000 0101 0101 0101 0101 0101 0101 0101 0101
*
0000400
===== END   [basic/zerobinary/zerobinary_head.sh] =====

以下、dd コマンドを使用したサンプルです。

#!/usr/bin/env bash

basedirpath=/tmp/try-linux/zerobinary

rm -rf "${basedirpath}"
mkdir -p "${basedirpath}"

## 指定したサイズで中身が \0 のデータのファイルを作る
#
dd if=/dev/zero of="${basedirpath}/zero.bin" bs=1024 count=1 2>/dev/null

# 確認
echo '----------------------------------------------'
ls -l "${basedirpath}/zero.bin"
hexdump "${basedirpath}/zero.bin"

## 中身を \1 のデータのファイルを作る
#
tmpfile=$(mktemp)
dd if=/dev/zero of="${tmpfile}" bs=1024 count=1 2>/dev/null
tr '\0' '\1' < "${tmpfile}" > "${basedirpath}/one.bin"

# 確認
echo '----------------------------------------------'
ls -l "${basedirpath}/one.bin"
hexdump "${basedirpath}/one.bin"
gitpod /workspace/try-linux $ make

ENTER EXAMPLE NAME: zerobinary_dd

[INPUT ] zerobinary_dd
[TARGET] zerobinary_dd
[SCRIPT] basic/zerobinary/zerobinary_dd.sh

===== START [basic/zerobinary/zerobinary_dd.sh] =====
----------------------------------------------
-rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:45 /tmp/try-linux/zerobinary/zero.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000400
----------------------------------------------
-rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:45 /tmp/try-linux/zerobinary/one.bin
0000000 0101 0101 0101 0101 0101 0101 0101 0101
*
0000400
===== END   [basic/zerobinary/zerobinary_dd.sh] =====

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com