ฉันจะต่อท้ายจำนวน null ที่เจาะจงต่อท้ายไฟล์ได้อย่างไร? [ปิด]


26

ฉันมีสคริปต์ที่เขียนไปยังไฟล์ไม่กี่ไฟล์ แต่ฉันต้องการให้มีขนาดเฉพาะ ดังนั้นฉันสงสัยว่ามีวิธีการต่อท้ายจำนวน null เฉพาะเจาะจงไปยังไฟล์โดยใช้เครื่องมือบรรทัดคำสั่งมาตรฐาน (เช่นโดยการคัดลอกจาก/dev/zero)?


1
คำถามนี้ดูเหมือนจะปิดหัวข้อเพราะมันเป็นเรื่องเกี่ยวกับการเขียนโปรแกรมซึ่งอยู่ในกองมากเกิน
เจนนี่ดีพูดว่า Reinstate Monica

ไม่oflag=appendทำงานสำหรับคุณ?
Mark K Cowan

เพื่อชี้แจงความคิดเห็นโดย @Mark K Cowan; เขาหมายถึงddคำสั่ง
Alexander Pozdneev

FYI ดูเหมือนว่าfallocateเป็นอีกหนึ่งตัวเลือกที่จะแทรกรูลงในไฟล์ superuser.com/a/1172904/111432
akostadinov

คำตอบ:


41

truncateเร็วกว่าddมาก หากต้องการขยายไฟล์ด้วย 10 ไบต์ให้ใช้:

 truncate -s +10 file.txt 

2
มันเร็วกว่ามากเพราะมันจะสร้างไฟล์แบบเบาบางซึ่งเป็นสิ่งที่คุณต้องการใช้เวลาส่วนใหญ่ แต่ถ้าคุณไม่ต้องการไฟล์แบบเบาบางวิธี dd จะใช้งานได้
Derobert

34

คุณสามารถลองสิ่งนี้ได้เช่นกัน

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

นี้จะอ่านจาก / dev / ศูนย์และผนวกเข้ากับ yourfile NUMBER ไบต์


7

ด้านล่างเป็นตัวอย่างของการผนวก 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 เป็น "go" ที่ส่วนท้ายของไฟล์และเพิ่มบางไบต์ที่อ่านก่อนหน้านี้จาก / 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

หากคุณกำลังขยายไฟล์ของคุณด้วย null null ฉันเดาว่าคุณกำลังจัดการไฟล์ใน a char *ถ้าเป็นกรณีนี้คุณอาจไม่จำเป็นต้อง pad ไฟล์ด้วย null null เพียงเพิ่ม null null ที่ท้าย ของไฟล์แล้วแพ็ดดิงด้วยไบต์แบบสุ่มอาจเพียงพอ ในกรณีนี้โปรแกรม C ร้องจะมีประสิทธิภาพมาก (จะใช้เฉพาะกับไฟล์ที่เล็กกว่าพารามิเตอร์ที่ 2 มิฉะนั้นข้อมูลจะถูกเขียนทับ) มันอาจทำสิ่งที่คุณต้องการ (padding with null bytes) ตามที่lseekนิยามของฟังก์ชันระบุไว้ว่า:

ฟังก์ชั่น lseek () จะอนุญาตให้ตั้งค่าไฟล์ตรงข้ามจุดสิ้นสุดของข้อมูลที่มีอยู่ในไฟล์ หากข้อมูลถูกเขียนในจุดนี้ในภายหลังการอ่านข้อมูลในภายหลังในช่องว่างจะส่งกลับไบต์ด้วยค่า 0 จนกว่าข้อมูลจะถูกเขียนลงในช่องว่าง

ในกรณีนี้การโทรครั้งที่ 1 ไปยังlseekและwriteสามารถลบออกได้ แต่การทดสอบควรทำในระบบของคุณอันดับที่ 1 ...

#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.