Bagaimana cara menambahkan jumlah byte tertentu ke file? [Tutup]


26

Saya memiliki skrip yang menulis ke beberapa file tetapi saya membutuhkannya dengan ukuran tertentu. Jadi saya bertanya-tanya apakah ada cara menambahkan sejumlah byte nol ke file dengan menggunakan alat baris perintah standar (misalnya, dengan menyalin dari /dev/zero)?


1
Pertanyaan ini tampaknya di luar topik karena ini tentang pemrograman, yang termasuk dalam Stack Overflow .
Jenny D mengatakan Reinstate Monica

Apakah oflag=appendberhasil untuk Anda?
Mark K Cowan

Untuk mengklarifikasi komentar oleh @Mark K Cowan; dia berarti ddperintah.
Alexander Pozdneev

FYI sepertinya fallocateadalah pilihan lain untuk menyisipkan lubang ke dalam file. superuser.com/a/1172904/111432
akostadinov

Jawaban:


41

truncatejauh lebih cepat daripada dd. Untuk menumbuhkan file dengan 10 byte gunakan:

 truncate -s +10 file.txt 

2
Ini jauh lebih cepat karena akan menghasilkan file yang jarang, yang paling sering Anda inginkan — tetapi jika Anda tidak menginginkan file yang jarang, pendekatan dd akan bekerja.
derobert

34

Anda dapat mencobanya juga

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

Ini akan membaca dari / dev / zero dan menambahkan ke file Anda NUMBER byte.


7

Di bawah ini adalah contoh menambahkan 10MB ke file hanya menggunakan dd.

[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

tebakan pertama saya adalah:

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

Pada dasarnya, perintah ini memberitahu dd untuk "pergi" di akhir file dan menambahkan beberapa byte yang sebelumnya dibaca dari / dev / zero.

Salam,


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

atau

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

dan untuk menghitung ukuran lebih mudah:

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

0

Jika Anda mengisi file Anda dengan byte nol, tebakan saya adalah bahwa Anda memanipulasi file dalam huruf char *C. Jika ini yang terjadi, Anda mungkin tidak perlu memuat file dengan null byte, hanya menambahkan byte nol di bagian akhir. file dan kemudian padding dengan byte acak bisa cukup. Dalam hal ini, program C di bawah ini akan sangat efisien (hanya digunakan pada file yang lebih kecil dari parameter ke-2, jika tidak, data akan ditimpa). Bahkan mungkin melakukan apa yang Anda inginkan (padding dengan byte nol) karena lseekdefinisi fungsi menyatakan bahwa:

Fungsi lseek () harus memungkinkan offset file diatur di luar akhir data yang ada dalam file. Jika data kemudian ditulis pada titik ini, selanjutnya pembacaan data di celah akan mengembalikan byte dengan nilai 0 sampai data benar-benar ditulis ke dalam celah.

Dalam hal ini, panggilan pertama ke lseekdan writedapat dihapus. Tetapi tes harus dilakukan pada sistem Anda ... Pertama ...

#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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.