Làm cách nào để thêm một số byte null cụ thể vào một tệp? [đóng cửa]


26

Tôi có một đoạn script ghi vào một vài tệp nhưng tôi cần chúng có kích thước cụ thể. Vì vậy, tôi tự hỏi liệu có cách nào để thêm một số byte null cụ thể vào một tệp bằng cách sử dụng các công cụ dòng lệnh tiêu chuẩn (ví dụ: bằng cách sao chép từ /dev/zero) không?


1
Câu hỏi này dường như lạc đề vì nó liên quan đến lập trình, thuộc về Stack Overflow .
Jenny D nói Phục hồi Monica

oflag=appendlàm việc cho bạn?
Mark K Cowan

Để làm rõ một bình luận của @Mark K Cowan; anh ta có nghĩa là ddmệnh lệnh.
Alexander Pozdneev

FYI có vẻ như fallocatelà một ý kiến ​​khác để chèn lỗ vào một tập tin. superuser.com/a/1172904/111432
akostadinov 19/12/18

Câu trả lời:


41

truncatenhanh hơn nhiều dd. Để phát triển tệp có 10 byte, hãy sử dụng:

 truncate -s +10 file.txt 

2
Nó nhanh hơn nhiều vì nó sẽ tạo ra một tệp thưa thớt, đó là điều bạn muốn hầu hết thời gian, nhưng nếu bạn không muốn một tệp thưa thớt, cách tiếp cận dd sẽ hoạt động.
derobert

34

Bạn cũng có thể thử điều này

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

Điều này sẽ đọc từ / dev / zero và nối vào SỐ byte của bạn.


7

Dưới đây là một ví dụ về việc gắn thêm 10MB vào một tệp chỉ sử dụng 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

dự đoán đầu tiên của tôi sẽ là:

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

Về cơ bản, lệnh này yêu cầu dd "đi" ở cuối tệp và thêm một số byte được đọc trước đó từ / dev / zero.

Trân trọng,


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

hoặc là

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

và để tính toán kích thước dễ dàng hơn:

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

0

Nếu bạn đang đệm tệp của mình bằng byte rỗng, tôi đoán là bạn đang thao tác với tệp trong char *C. Nếu đây là trường hợp, bạn có thể không cần phải đệm tệp bằng byte rỗng, chỉ thêm một byte null vào cuối của tập tin và sau đó đệm nó với các byte ngẫu nhiên có thể là đủ. Trong trường hợp này, phần dưới của chương trình C sẽ rất hiệu quả (chỉ được sử dụng trên các tệp nhỏ hơn tham số thứ 2, nếu không dữ liệu sẽ bị ghi đè). Nó thậm chí có thể làm những gì bạn muốn (đệm bằng byte rỗng) khi lseekđịnh nghĩa hàm nói rằng:

Hàm lseek () sẽ cho phép bù tập tin được đặt ngoài phần cuối của dữ liệu hiện có trong tệp. Nếu dữ liệu sau đó được ghi vào thời điểm này, các lần đọc dữ liệu tiếp theo trong khoảng trống sẽ trả về các byte có giá trị 0 cho đến khi dữ liệu thực sự được ghi vào khoảng trống.

Trong trường hợp này, cuộc gọi đầu tiên đến lseekwritecó thể được gỡ bỏ. Nhưng các bài kiểm tra nên được thực hiện trên hệ thống của bạn ...

#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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.