ডিডি: একাধিক ইনপুট ফাইল


14

আমাকে দুটি ফাইল থেকে অংশগুলি সংযুক্ত করতে হবে:

আমার যদি পুরো ফাইলগুলি সংবিধানের প্রয়োজন হয় তবে আমি কেবল এটি করতে পারি

cat file1 file2 > output

তবে আমাকে প্রথম ফাইলটি থেকে প্রথম 1MB এড়িয়ে যেতে হবে এবং আমি কেবল দ্বিতীয় ফাইল থেকে 10 এমবি চাই। একটি কাজের মত শোনাচ্ছে dd

dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output

এক ধাপে এটি করার কি সম্ভাবনা আছে? অর্থাত্‍ মধ্যবর্তী ফলাফল সংরক্ষণ করার দরকার নেই? আমি কি একাধিক ইনপুট ফাইলগুলিতে ব্যবহার করতে পারি dd?

উত্তর:


21

dd stdout খুব লিখতে পারেন।

( dd if=file1 bs=1M count=99 skip=1
  dd if=file2 bs=1M count=10  ) > final_output

এটি সম্ভবত সবচেয়ে ভাল উপায়। আউটপুট ফাইলটি বন্ধ / পুনরায় খোলা হয়নি (যেমন এটি রয়েছে oflag=append conv=notrunc), সুতরাং যে বিলম্ব বরাদ্দ (এক্সএফএস এর মতো) করে এমন ফাইল সিস্টেমগুলি আরও কিছু করার পরেও ফাইলটি লিখিত হচ্ছে কিনা তা নির্ধারণ করার সম্ভাবনা রয়েছে।
পিটার কর্ডেস

@ পিটারকর্ডস এটি একটি ভাল পয়েন্ট, তবে যতক্ষণ ddনা জিজ্ঞাসা করা হবে ততক্ষণ syncবিলম্বিত বরাদ্দটি তত্ক্ষণাত তাত্ক্ষণিকভাবে শুরু করা উচিত নয় (স্মৃতিশক্তি শক্ত না হলে ক্ষেত্রে কোনও পদ্ধতি বরাদ্দ পিছিয়ে দেবে না)।
স্টিফেন কিট 2'16

@ স্টেফেনকিট: আপনি সম্ভবত ঠিক বলেছেন। আমি এক্সএফএসের অনুমানমূলক পূর্বনির্ধারণের কথা ভাবছিলাম , যেখানে এটি বিশেষভাবে বন্ধ / পুনরায় খোলা অ্যাক্সেস প্যাটার্নটি সনাক্ত করতে হবে (কখনও কখনও লগ ফাইলগুলির জন্য দেখা হয়)।
পিটার কর্ডেস

3
শেলগুলিতে bashএবং mkshএটিতে একটি সাব- শেলের শেষ কমান্ডের জন্য কাঁটাচামচটি অপ্টিমাইজ করে না, আপনি কমান্ড গ্রুপের সাথে সাব-শেলটি প্রতিস্থাপন করে এটিকে কিছুটা দক্ষ করতে পারেন। অন্যান্য শেলগুলির জন্য, এটি কোনও ব্যাপার নয়, এবং শেল স্টাডআউট সংরক্ষণ এবং পুনরুদ্ধার করার প্রয়োজন নেই বলে শেল অ্যাপ্রোচটি আরও কিছুটা দক্ষ হতে পারে।
স্টাফেন চেজেলাস

10

আমি মনে করি না আপনি একক ddঅনুরোধে সহজেই একাধিক ফাইল পড়তে পারেন , তবে আপনি বেশ কয়েকটি পদক্ষেপে আউটপুট ফাইলটি তৈরি করতে সংযোজন করতে পারেন:

dd if=file1 bs=1M count=99 skip=1 of=final_output
dd if=file2 bs=1M count=10 of=final_output oflag=append conv=notrunc

আপনাকে conv=notruncএবং উভয়ই নির্দিষ্ট করতে হবে oflag=append। প্রথমটি আউটপুট কেটে যাওয়া এড়িয়ে চলে, দ্বিতীয়টি বিদ্যমান ফাইলটির শেষে থেকে লেখা শুরু করে।


8

মনে রাখবেন যে ddআপনি একটি কাঁচা ইন্টারফেস read(), write()এবং lseek()সিস্টেম কল। আপনি কেবল এটি নিয়মিত ফাইল, ব্লক ডিভাইস এবং কিছু চরিত্র ডিভাইস (যেমন /dev/urandom) বন্ধ করে বিশদরূপে ব্যবহার করতে পারেন , এটি এমন ফাইল যা ফাইলের শেষ না হওয়া অবধি read(buf, size)ফেরত দেওয়ার গ্যারান্টিযুক্ত size

পাইপ, সকেট এবং সর্বাধিক অক্ষরযুক্ত ডিভাইসের জন্য (যেমন টিটিস), আপনি যদি read()আকার 1 টি না করেন বা GNU ddএক্সটেনশন ব্যবহার না করেন তবে আপনার আর কোনও গ্যারান্টি নেই iflag=fullblock

সুতরাং হয়:

{
  gdd < file1 bs=1M iflag=fullblock count=99 skip=1
  gdd < file2 bs=1M iflag=fullblock count=10
} > final_output

বা:

M=1048576
{
  dd < file1 bs=1 count="$((99*M))" skip="$M"
  dd < file2 bs=1 count="$((10*M))"
} > final_output

অথবা সিক অপারেটরের জন্য অন্তর্নির্মিত সমর্থন সহ শাঁস সহ ksh93:

M=1048576
{
  command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
  command /opt/ast/bin/head -c "$((10*M))" < file2
}

বা zsh( এখানে headআপনার -cবিকল্পগুলি সমর্থন করে তা ধরে নিচ্ছেন ):

zmodload zsh/system &&
{
  sysseek 1048576 && head -c 99M &&
  head -c 10M < file2
} < file1 > final_output

আপনার কি সত্যই উদ্ধৃতি দরকার? ফলাফল সবসময় একটি পূর্ণসংখ্যার হতে হবে না?
স্টিভেন পেনি

@ স্টিভেনপেনি, সম্প্রসারণকে অব্যক্ত রেখে শেলকে বিভক্ত করতে বলছে + বিশ্বকে এটি বিশ্বব্যাপী বোধ করবে না। বিভক্ত অংশটির বর্তমান মানটি করা হচ্ছে $IFS। এটি ভেরিয়েবল / প্রসারণের বিষয়বস্তু নির্বিশেষে। বাশ / পসিক্স শেলের একটি পরিবর্তনশীল উদ্ধৃতি ভুলে যাওয়ার সুরক্ষা সম্পর্কিত প্রভাবগুলিও
স্টাফেন চেজেলাস

@ স্টাফেন চেজেলাস - প্রথম উদাহরণে আপনি এর gddপরিবর্তে ব্যবহার করছেন dd। এটা কি টাইপো, নাকি ইচ্ছাকৃত?
মার্টিন ভেজিটার

3

একটি সঙ্গে ব্যাশ আইএসএস , এবং একটি বৈশিষ্ট্যগুলি "এর বেহুদা ব্যবহার বিড়াল ", কিন্তু সিনট্যাক্স নিকটস্থ ওপি ব্যবহার করে:

cat <(dd if=file1 bs=1M count=99 skip=1) \
    <(dd if=file2 bs=1M count=10) \
   > final_output

(এটি বলা হচ্ছে, স্টিফেন কিটের উত্তরটি সম্ভবত সবচেয়ে কার্যকর পদ্ধতি বলে মনে হচ্ছে ।)


3
কঠোরভাবে বলতে, <(...)একটি হল kshism যা উভয় zshএবং bashঅনুলিপি করা হয়েছে।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.