এইভাবে আপনি এটি করতে পারেন:
i=$(((t=19876543212)-(h=12345678901)))
{ dd count=0 skip=1 bs="$h"
dd count="$((i/(b=64*1024)-1))" bs="$b"
dd count=1 bs="$((i%b))"
} <infile >outfile
আসলেই এটি প্রয়োজনীয় - এটির জন্য আরও বেশি কিছু লাগবে না। প্রথমেই dd count=0 skip=1 bs=$block_size1হবে lseek()কার্যত তাত্ক্ষণিকভাবে নিয়মিত ফাইল ইনপুট করে। কোনও মিসড ডেটা বা অন্যান্য মিথ্যাচারের বিষয়ে যা বলা আছে, তার কোনও সম্ভাবনা নেই , আপনি কেবল নিজের কাঙ্ক্ষিত শুরু অবস্থানটিতে সরাসরি চাইতে পারেন। ফাইল বিবরণকারীটির শেলটির মালিকানা রয়েছে এবং এটি ddকেবল এটির উত্তরাধিকার সূত্রে প্রাপ্ত, তাই তারা এর কার্সারের অবস্থানকে প্রভাবিত করবে এবং আপনি কেবল এটিকে পদক্ষেপে নিতে পারেন। এটি সত্যিই খুব সহজ - এবং কার্যকরের চেয়ে উপযুক্ত কোনও মানক সরঞ্জাম নেই dd।
এটি একটি 64 কে ব্লকসাইজ ব্যবহার করে যা প্রায়শই আদর্শ। জনপ্রিয় বিশ্বাসের বিপরীতে, বৃহত্তর ব্লক আকারগুলি ddদ্রুত কাজ করে না । অন্যদিকে, ক্ষুদ্র বাফারগুলিও ভাল নয়। ddসিস্টেম কলগুলিতে তার সময়টি সিঙ্ক্রোনাইজ করা দরকার যাতে এটি মেমরিতে এবং আবারও অনুলিপি করে ডেটা অনুলিপি করার অপেক্ষা রাখে না, তবে এটি যাতে সিস্টেম কলগুলিতে অপেক্ষা না করে। সুতরাং আপনি এটি পর্যাপ্ত সময় নিতে চান যে পরেরটি read()শেষের জন্য অপেক্ষা করতে না পারে, তবে এত বেশি নয় যে আপনি প্রয়োজনীয়তার চেয়ে বড় আকারে বাফার করছেন।
সুতরাং প্রথম ddঅবস্থানে শুরু অবস্থান। শূন্য সময় লাগে । আপনি যে স্ট্যান্ডিন পড়তে সেই মুহুর্তে আপনার পছন্দ মতো অন্য কোনও প্রোগ্রাম কল করতে পারেন এবং এটি সরাসরি আপনার পছন্দসই বাইট অফসেটে পড়া শুরু করবে। আমি স্ট্যান্ডআউটে কাউন্ট ব্লকগুলি ddপড়তে অন্যকে কল করি ((interval / blocksize) -1)।
সর্বশেষ যেটি প্রয়োজনীয় তা হ'ল পূর্ববর্তী বিভাগের ক্রিয়াকলাপের মডুলাস (যদি থাকে) অনুলিপি করা । এবং এটি।
এটি কোনওভাবেই বিশ্বাস করবেন না, যখন লোকেরা প্রমাণ ছাড়াই তাদের মুখে ঘটনা বর্ণনা করে। হ্যাঁ, ddএকটি সংক্ষিপ্ত পঠন করা সম্ভব (যদিও স্বাস্থ্যকর ব্লক ডিভাইস থেকে পড়ার সময় এই জাতীয় জিনিসগুলি সম্ভব নয় - এইভাবে নাম) । এই জাতীয় জিনিসগুলি কেবলমাত্র তখনই সম্ভব যদি আপনি ddকোনও ব্লক ডিভাইস বাদে অন্য পাঠানো স্ট্রিমটি সঠিকভাবে বাফার না করেন । উদাহরণ স্বরূপ:
cat data | dd bs="$num" ### incorrect
cat data | dd ibs="$PIPE_MAX" obs="$buf_size" ### correct
উভয় ক্ষেত্রেই সমস্ত ডেটা ddঅনুলিপি করে। প্রথম ক্ষেত্রে এটি সম্ভব (যদিও এর সাথে অসম্ভব ) যে কিছু আউটপুট ব্লক অনুলিপি করে যা কিছু অনুলিপি "$ num" বাইট হিসাবে সমান হবে কারণ যখন বাফারকে তার কমান্ডে নির্দিষ্টভাবে অনুরোধ করা হয় তখন কেবল কিছুতেই বাফার করা যায় spec লাইন। একটি প্রতিনিধিত্ব করে সর্বোচ্চ ব্লক-মাপ কারণ উদ্দেশ্য এর রিয়েল-টাইম I / O হয়।catddddbs=dd
দ্বিতীয় উদাহরণে আমি স্পষ্টভাবে আউটপুট ব্লকসাইজ এবং ddবাফারগুলি সম্পূর্ণ লেখার আগ পর্যন্ত পড়া নির্দিষ্ট করে উল্লেখ করি । এটি count=কোনটি ইনপুট ব্লকের উপর ভিত্তি করে প্রভাবিত করে না , তবে এর জন্য আপনার কেবল অন্য একটি প্রয়োজন dd। অন্যথায় আপনাকে দেওয়া কোনও ভুল তথ্য উপেক্ষা করা উচিত।
bs=1M iflag=skip_bytes,count_bytes