特定の数のヌルバイトをファイルに追加するにはどうすればよいですか?[閉まっている]


26

いくつかのファイルに書き込むスクリプトがありますが、特定のサイズが必要です。だから、標準のコマンドラインツールを使用して(たとえば、からコピーすることによって/dev/zero)特定の数のヌルバイトをファイルに追加する方法があるのだろうか?


1
この質問は、Stack Overflowに属するプログラミングに関するものであるため、トピック外のようです。
ジェニーDは、モニカ

あなたのoflag=appendために働きますか?
マークKコーワン14年

@Mark K Cowanによるコメントを明確にするため。彼はddコマンドを意味します。
アレクサンダーポズドネエフ

fallocate参考までに、ファイルに穴を挿入する別のオピオンのようです。superuser.com/a/1172904/111432
akostadinov

回答:


41

truncateは、よりもはるかに高速ですdd。10バイトでファイルを拡大するには、次を使用します。

 truncate -s +10 file.txt 

2
スパースファイルを生成するため、はるかに高速です。これは、ほとんどの場合に必要なものですが、スパースファイルが必要ない場合は、ddアプローチが機能します。
デロバート

34

これも試してみてください

dd if=/dev/zero bs=1 count=NUMBER >> yourfile

これは/ dev / zeroから読み取り、ファイルにNUMBERバイトを追加します。


7

以下は、ddのみを使用してファイルに10MBを追加する例です。

[root@rhel ~]# cp /etc/motd ./test
[root@rhel ~]# hexdump -C test |tail -5
000003e0  0a 0a 3d 3d 3d 3d 3e 20  54 65 78 74 20 6f 66 20  |..====> Text of |
000003f0  74 68 69 73 20 6d 65 73  73 61 67 65 20 69 73 20  |this message is |
00000400  69 6e 20 2f 65 74 63 2f  6d 6f 74 64 20 3c 3d 3d  |in /etc/motd <==|
00000410  3d 3d 0a                                          |==.|
00000413

[root@rhel ~]# dd if=/dev/zero of=/root/test ibs=1M count=10 obs=1M oflag=append conv=notrunc
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0208541 s, 503 MB/s

[root@rhel ~]# hexdump -C test |tail -5
00000410  3d 3d 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |==..............|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00a00410  00 00 00                                          |...|
00a00413

5

私の最初の推測は次のようになります:

dd if=/dev/zero of=myfile bs=1 count=nb_of_bytes seek=$(stat -c%s myfile)

基本的に、このコマンドはddにファイルの最後に「移動」し、/ dev / zeroから以前に読み取ったいくつかのバイトを追加するよう指示します。

よろしく、


2
cat "your file" /dev/zero | head -c "total number of bytes"

または

head -c "number of bytes to add" /dev/zero >> "your_file"

より簡単にサイズを計算するには:

head -c $(( "total number of bytes" - $(stat -c "%s" "your_file") )) /dev/zero >> "your_file"

0

ファイルにヌルバイトをパディングしている場合、私の推測はchar *Cでファイルを操作していることです。この場合、ファイルにヌルバイトをパディングする必要はなく、最後にヌルバイトを追加するだけですファイルのランダムなバイトでパディングするだけで十分かもしれません。この場合、Cプログラムは非常に効率的です(2番目のパラメーターよりも小さいファイルでのみ使用します。そうしないと、データが上書きされます)。lseek関数定義で次のように記述されているため、必要な処理(ヌルバイトでパディング)を行うこともできます。

lseek()関数は、ファイル内の既存のデータの終わりを超えてファイルオフセットを設定できるようにします。この時点でデータが後で書き込まれる場合、ギャップ内のデータの後続の読み取りは、データが実際にギャップに書き込まれるまで、値0のバイトを返します。

この場合、第一の呼び出しにlseekしてwrite除去することができました。しかし、テストは最初にシステムで行う必要があります...

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

/* 1st parameter: a file name, 2nd parameter: a file size. */
int main(int argc, char ** args) {
   int nfd = open(args[1], O_WRONLY);
   lseek(nfd, 0, SEEK_END);
   write(nfd, "\0", 1);
   lseek(nfd, atoi(args[2]) - 1, SEEK_SET);
   write(nfd, "\0", 1);
   close(nfd);
   return 0;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.