web-dev-qa-db-ja.com

任意の「偽」ファイルを作成する

/dev/nullまたは/dev/randomに類似した特別なファイルを作成したいと思います。ファイルは実際には存在しませんが、実際に読み取ることができますが、実際にはファイルの見かけのサイズ。

別の言い方をすれば、(キャットを500GBに設定したと仮定して)特別なファイルを作成して、ファイルを「キャット」すると、500GBのファイルがすべて出力されて停止します。実際の500GBファイルと同じように動作する必要がありますが、スペースを占有しません。このファイルの内容は重要ではありません。すべての\0/dev/nullのようになっている場合や、小さな文字列が繰り返し送信されている場合などがあります。

これはできることですか?私が見つけることができたのは、mknodに関するmanページだけです。しかし、それらはあまり役に立ちませんでした。

16
Mediocre Gopher

sparse file を特定のファイルシステムに作成できますappearは特定のサイズになります、しかし実際にはそれほど多くのスペースを使用しませんon disk

$ dd if=/dev/null of=sparse bs=1024 count=1 seek=524288000
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.4444e-05 s, 0.0 kB/s
$ ls -l sparse 
-rw-rw-r--. 1 ignacio ignacio 536870912000 May  9 22:25 sparse
$ du -h sparse
0   sparse

ファイルをシークする必要がない場合は、名前付きパイプを使用できます。

mkfifo my_special_file
yes | head -n 100 > my_special_file&
cat my_special_file

もちろん、複雑なスクリプトを含む他のコマンドを使用して、パイプ内にデータを生成できます。

1
jfg956

すでに述べたポータブルdd/seekベースのソリューションに加えて、一部のUnixには特殊なコマンドがあります。

少なくとも SolarisMacOS/X および Irix の場合:

mkfile -n 500m sparseFile

HP-UXでは prealloc 、AIX lmktempでは。多くのLinuxディストリビューションには truncate

1
jlliagre

まあ、ddを使用すると、ブロックサイズとカウントを指定できるため、次のようにサイズを制限できます。

dd if=/dev/urandom count=5 bs=1024 > nullfile

そこから読みたい場合は、パイプしてください:

dd if=/dev/urandom count=5 bs=1024 | yourReadingProcess 

以前は、私が作成したすべてのLinuxインストールには、いくつかのネットワークツール、portmap、inet.dなどが付属しており、inet.dでは、いくつかのサービスが常に指定されていました。

(... 1分後...)

はい。/etc/servicesには、

chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source

つまり、何かをテストするサービスであり、ネットワークを介して文字(おそらくランダム)を送信するサービスだと思います。私のPCでは/etc/xinet.d/chargenしか見つかりません。より多くの情報があります:

# default: off
# description: An xinetd internal service which generate characters.  The
# xinetd internal service which continuously generates characters until the
# connection is dropped.  The characters look something like this:
# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
# This is the tcp version.

しかし、私はあなたの目的のためにそれを使用する方法を知りません。

0
user unknown