আমি কীভাবে একটি ফাইলটিতে নির্দিষ্ট সংখ্যক নাল বাইট যুক্ত করব? [বন্ধ]


26

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা কয়েকটি ফাইলে লিখেছে তবে তাদের একটি নির্দিষ্ট আকার প্রয়োজন need সুতরাং আমি ভাবছি যদি কোনও স্ট্যান্ডার্ড কমান্ড লাইন সরঞ্জাম (উদাহরণস্বরূপ, অনুলিপি দ্বারা /dev/zero) কোনও ফাইলকে একটি নির্দিষ্ট সংখ্যক নাল বাইট যুক্ত করার উপায় নেই ?


1
এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি প্রোগ্রামিং সম্পর্কিত, যা স্ট্যাক ওভারফ্লোতে অন্তর্ভুক্ত
জেনি ডি বলছেন মনিকা পুনরায় ইনস্টল করুন

আপনার oflag=appendজন্য কাজ করে?
মার্ক কে কোয়ান

@ মার্ক কে কোওয়ানের একটি মন্তব্য স্পষ্ট করার জন্য; তিনি ddআদেশ মানে ।
আলেকজান্ডার পোজডনিভ

এফওয়াইআই মনে fallocateহয় কোনও ফাইলের মধ্যে ছিদ্র সন্নিবেশ করানোর মত অন্য বিকল্প। superuser.com/a/1172904/111432
akostadinov

উত্তর:


41

truncateতুলনায় অনেক দ্রুত dd। 10 বাইট ব্যবহার করে ফাইলটি বাড়ানোর জন্য:

 truncate -s +10 file.txt 

2
এটি তাত্পর্যপূর্ণ কারণ এটি একটি স্পার ফাইল তৈরি করবে, যা আপনি বেশিরভাগ সময় চান — তবে আপনি যদি খুব কম ফাইল না চান, তবে ডিডি পদ্ধতির কাজ হবে।
ডার্বোবার্ট

34

আপনি এটি চেষ্টা করতে পারেন

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

এটি / dev / শূন্য থেকে পড়বে এবং আপনার ফাইলে NUMBER বাইট যুক্ত করবে।


7

নীচে কেবলমাত্র ডিডি ব্যবহার করে কোনও ফাইলে 10 এমবি যুক্ত করার উদাহরণ দেওয়া আছে।

[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)

মূলত, এই কমান্ডটি ডিডিকে ফাইলের শেষে "যেতে" এবং / dev / শূন্য থেকে পূর্বে পড়া কিছু বাইট যুক্ত করতে বলে।

শুভেচ্ছা সহ,


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 *সি-তে ফাইলটি চালাচ্ছেন যদি এটি হয় তবে আপনার কেবল ফাইলটি নাল বাইট দিয়ে প্যাড করার প্রয়োজন হবে না, কেবল শেষে নাল বাইট যুক্ত করুন ফাইলটি এবং তারপরে এলোমেলো বাইট সহ প্যাডিং যথেষ্ট হতে পারে। এই ক্ষেত্রে, সি প্রোগ্রাম বেলো খুব দক্ষ হবে (কেবলমাত্র ২ য় প্যারামিটারের চেয়ে ছোট ফাইলগুলিতে ব্যবহার করা হবে, অন্যথায় ডেটা ওভাররাইট করা হবে)। এটি এমনকি আপনি যা করতে চান তা করতে পারে (নাল বাইট সহ প্যাডিং) lseekফাংশন সংজ্ঞাতে বলা হয়েছে যে:

Lseek () ফাংশনটি ফাইলটিতে অফসেটটিকে ফাইলের বিদ্যমান ডেটার শেষের বাইরে সেট করার অনুমতি দেয়। যদি পরবর্তী সময়ে এই স্থানে ডেটা লেখা হয় তবে ফাঁক থাকা তথ্যগুলির পরবর্তী পাঠগুলি 0 মান সহ বাইটগুলি ফিরে আসবে যতক্ষণ না তথ্যটি ফাঁকে ফাঁকে লেখা হয়।

এই ক্ষেত্রে, 1 ম কল 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.