একক উত্স থেকে একাধিক লক্ষ্যবস্তুতে সমান্তরাল ফাইল অনুলিপি?


15

অপটিকাল মিডিয়াতে আমার কাছে বেশ কয়েকটি বড় ফাইল রয়েছে যা আমি একাধিক লক্ষ্যবস্তুতে অনুলিপি করতে চাই - এই ক্ষেত্রে আমার একই কম্পিউটারে দুটি হার্ড ড্রাইভ সংযুক্ত আছে। এমন কোনও ইউটিলিটি রয়েছে যা এর মতো কাজ করতে পারে:

copy source target1 target2 ... targetN

উত্তর:


23

একক ফাইলের জন্য আপনি teeএকাধিক জায়গায় অনুলিপি করতে পারেন :

cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>

অথবা আপনি যদি ডেমোগিগিফিক সংস্করণ পছন্দ করেন:

tee <outfile1> <outfile2> > <outfile3> < <inputfile>

নোট করুন যেহেতু ডেনিস মন্তব্যগুলির teeআউটপুটগুলিতে stdoutপাশাপাশি তালিকাভুক্ত ফাইলগুলিতে উল্লেখ করেছেন, সুতরাং উপরের উদাহরণগুলিতে 3 ফাইলটি নির্দেশিত করতে পুনঃনির্দেশ ব্যবহার করে। আপনি /dev/nullএটি নীচে হিসাবেও পুনর্নির্দেশ করতে পারেন - কমান্ড লাইনে ফাইল তালিকাটি আরও ধারাবাহিকভাবে রাখার সুবিধা রয়েছে (যা ফাইলের পরিবর্তনশীল সংখ্যার জন্য সমাধানের স্ক্রিপ্ট তৈরি করা সহজ করতে পারে) তবে এটি কিছুটা কম দক্ষ (যদিও এটি দক্ষতা পার্থক্য ছোট: catসংস্করণ বা সংস্করণ ছাড়া ব্যবহারের মধ্যে পার্থক্য প্রায় cat):

cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null

আপনি সম্ভবত findএকটি ডিরেক্টরিতে একাধিক ফাইল পরিচালনা করতে এবং খুব সহজেই ডিরেক্টরি কাঠামোর মধ্যে ছড়িয়ে পড়া ফাইলগুলিতে অপারেটিং করতে খুব সহজেই উপরের যে কোনওটিকে একত্রিত করতে পারেন। অন্যথায় আপনাকে কেবল পৃথক কার্য হিসাবে সমান্তরালে একাধিক অনুলিপি অপারেশন সেট করতে হবে এবং আশা করতে হবে যে ওএস ডিস্কের ক্যাশেটি উজ্জ্বল এবং / বা যথেষ্ট বড় যে প্রতিটি সমান্তরাল কাজ প্রথম থেকে ক্যাশেড ডেটা ব্যবহার করে ড্রাইভ-হেডের পরিবর্তে পিটুনি।

উপলভ্যতা: teeসাধারণত জিএনইউ "কোর্টিলস" প্যাকেজের অংশ হিসাবে স্ট্যান্ডার্ড লিনাক্স সেটআপগুলি এবং অন্যান্য ইউনিক্স বা ইউনিক্স-অ্যালাইক সিস্টেমে সাধারণত উপলব্ধ। আপনি যদি উইন্ডোজ ব্যবহার করে থাকেন (আপনার প্রশ্নটি নির্দিষ্ট করে না) তবে আপনার এটি সাইগউইনের মতো বিভিন্ন উইন্ডোজ বন্দরে সন্ধান করা উচিত।

অগ্রগতি তথ্য: অপটিকাল মিডিয়া থেকে একটি বড় ফাইল অনুলিপি করতে কিছু সময় লাগতে পারে (বা ধীর নেটওয়ার্কের উপরে, বা এমনকি স্থানীয় দ্রুত মিডিয়া থেকে আরও বড় ফাইল), অগ্রগতির তথ্য কার্যকর হতে পারে। কমান্ড লাইন আমি ব্যবহারের প্রবণতা নল ভিউয়ার এই জন্য (অধিকাংশ লিনাক্স ডিস্ট্রো & অনেক উইন্ডোজ বন্দর সংগ্রহ এবং সহজ লভ্য যেখানে উপলব্ধ সরাসরি নিজেকে কম্পাইল করার) - মাত্র প্রতিস্থাপন catসঙ্গে pvযেমন:

pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>

আমি tee.exe আনক্সুটিলস প্যাকেজের অংশ হতে পেয়েছি। দুর্দান্ত টিপ জন্য ধন্যবাদ!
গয়িক্স

5
নোট যে teeস্ট্যান্ডআউটে আউটপুট হবে, সুতরাং আপনি tee outputfile1 outputfile2 < inputfile > /dev/nullটার্মিনালে একটি বাইনারি ফাইল আউটপুট আউট করানো যেহেতু এটি করতে চাইতে পারেন এটির সেটিংসের সাথে গোলমাল এবং গোলযোগ হতে পারে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

ডিরেক্টরি এবং একাধিক ফাইলের জন্য কেবল বিড়ালের পরিবর্তে টার ব্যবহার করুন। উদাহরণ হিসেবে বলা যায়tar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
সি আর।

5

উইন্ডোজ জন্য:

n2ncopy এটি করবে:

বিকল্প পাঠ

লিনাক্সের জন্য:

cpকমান্ড একা একাধিক উত্স কিন্তু দুর্ভাগ্যবশত বহু না গন্তব্যস্থল থেকে অনুলিপি করতে পারবেন। আপনার এটি কোনও ধরণের লুপে একাধিকবার চালানো দরকার। আপনি এর মতো একটি লুপ ব্যবহার করতে পারেন এবং একটি ডিরেক্টরিতে সমস্ত ডিরেক্টরি নাম রাখতে পারেন:

OLDIFS=$IFS
IFS=$'\n'

for line in $(cat file.txt):
do
   cp file $line
done

IFS=$OLDIFS

বা xargs ব্যবহার করুন:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

এই দুটিই আপনাকে সম্পূর্ণ ডিরেক্টরি / একাধিক ফাইল অনুলিপি করার অনুমতি দেবে। এটাও আলোচনা করা হয়েছে এই Stackoverflow নিবন্ধ।


N2NCopy লিঙ্কটি ভাঙ্গা দেখা যাচ্ছে।
ওয়েসলি


4

অনুরূপ প্রশ্নের জন্য দেওয়া উত্তরের ভিত্তিতে আরেকটি উপায় হ'ল একবারে একাধিক ইনস্ট্যান্স চালানোর জন্য জিএনইউ সমান্তরাল ব্যবহার করা cp:

parallel -j 0 -N 1 cp file1 ::: Destination1 Destination2 Destination3

উপরের কমান্ডটি ফাইলটিকে সমান্তরালভাবে তিনটি গন্তব্য ফোল্ডারে কপি করবে


2

ব্যাশে (লিনাক্স, ম্যাক বা সাইগউইন):

cat source | tee target1 target2 >targetN

(টি এটি স্টপআউটে এর ইনপুট অনুলিপি করে, তাই শেষ লক্ষ্যকে পুনর্নির্দেশ ব্যবহার করুন)।

উইন্ডোজে সাইগউইন প্রায়শই ওভারকিল করে। পরিবর্তে, আপনি কেবল আনেক্সটিলস প্রকল্পের এক্সেস যোগ করতে পারেন , যার মধ্যে বিড়াল, টি এবং আরও অনেক কিছু রয়েছে।


1

রায়ান থম্পসনের সমাধান:

for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;

অনেকটা অর্থবহ করে তোলে: গন্তব্য ডায়ারগুলির লেখার গতি যদি প্রায় একই হয় তবে ডিস্ক থেকে কেবলমাত্র একবারে সিআরসিফাইল পড়তে হবে। বাকি সময় এটি ক্যাশে থেকে পড়া হবে।

আমি এটিকে কিছুটা সাধারণ করে তুলব, যাতে আপনি সাবডিয়ারও পান:

for x in dest1 dest2 dest3; do cp -a srcdir $x &; done; wait;

যদি ডেস্ট ডায়ারগুলির লেখার গতি খুব আলাদা হয় (যেমন একটি র‌্যাম ডিস্কে থাকে এবং অন্যটি এনএফএসে থাকে), তবে আপনি দেখতে পাবেন srcdir এর অংশগুলি লেখার সময় ডিস্ক ক্যাশে আর নেই dest2।


1

এই উত্তর অনুসারে: /superuser//a/1064516/702806

একটি ভাল সমাধান ব্যবহার tarএবং tee। কমান্ডটি আরও জটিল তবে tarস্থানান্তরের জন্য এটি বেশ শক্তিশালী বলে মনে হচ্ছে এবং উত্সটি একবারে পড়া দরকার।

tar -c /source/dirA/ /source/file1 | tee >(cd /foo/destination3/; tar -x) >(cd /bar/destination2/; tar -x) >(cd /foobar/destination1/; tar -x) > /dev/null

এটি কোনও স্ক্রিপ্টে ব্যবহার করতে আপনার স্ক্রিপ্টটি চালু করতে হতে পারে bash -x script.sh


হাস্যকর. আমি ভেবেছিলাম "এটির কোনও অর্থ নেই, একটি উত্সাহ দিন"। সম্মত। তারপরে আমি লিঙ্কটি চেক করেছি ...: ডি
কামিল ম্যাকিয়েরোভস্কি

আপনি যদি একসাথে একাধিক ফাইল অনুলিপি করে থাকেন তবে ডেভিড স্পিলিটের (গৃহীত) উত্তরের চেয়ে এটি সুস্পষ্টভাবে উচ্চতর । একটি একক উত্স ফাইলের জন্য, কেবলমাত্র আমি tarযে যুক্তিটি দেখতে পাচ্ছি তা হ'ল এটি স্বয়ংক্রিয়ভাবে ফাইলের বৈশিষ্ট্যগুলি (যেমন, পরিবর্তনের তারিখ / সময়, (সুরক্ষা) মোড এবং সম্ভাব্য এসিএল, মালিক / গোষ্ঠী (সুবিধাপ্রাপ্ত হলে) অনুলিপি করবে) প্রসঙ্গ (প্রযোজ্য ক্ষেত্রে), বর্ধিত বৈশিষ্ট্য (প্রযোজ্য ক্ষেত্রে), ইত্যাদি)………………… পিএস ব্যবহারকারীর কেন ব্যবহারের প্রয়োজন হবে bash -x?
স্কট 19

আমি #!/bin/shআমার স্ক্রিপ্টের শুরুতে ব্যবহার করেছি কিন্তু কমান্ডের বাক্য গঠন গ্রহণ করা হয় না। আপনি bash -xবা #!/bin/bashআপনার ফাইলের শুরুতে ব্যবহার করতে পারেন । আমি কেন জানি না shএবং bashব্যাখ্যাগুলির মধ্যে পার্থক্য রয়েছে ।
রামি গিরার্ড

কামিল ম্যাকিয়েরোভস্কি - আমি জানি না কেন আপনার উত্তরটি উচ্চারণ করা হয়নি। এটি সঠিক সমাধান। আমি এটি ভাগ করতে চেয়েছিলেন।
রামি গিরার্ড

0

ব্যাশে:

for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;

2
আমি মনে করি না এটি ভাল অভিনয় করবে। আদর্শভাবে সমান্তরাল অনুলিপিতে আপনি একবার পড়বেন, বহুবার লিখেছেন। আমি মনে করি এটি 1: 1 পড়বে: লিখেছেন। সম্ভবত যদি কপিগুলি পর্যাপ্ত দ্রুত শুরু হয় এবং ড্রাইভের ক্যাশে যথেষ্ট বড় হয় তবে আপনাকে আসলে পড়ার মাথাগুলির প্রয়োজন হবে না।
কোয়াকোট কোয়েসোট

0

আপনি যদি উইন্ডোতে পাওয়ারশেল থেকে এটি করতে চান তবে এটি ডিফল্টরূপে সম্ভব নয় কারণ -Pathযুক্তির বিপরীতে , -Destinationএকাধিক যুক্তি গ্রহণ করে না। তবে, আপনি ব্যবহার করতে পারেন-Passthrough কমান্ডগুলি ডেইজি-চেইন এবং । (তবে এটি কোনও মজাদার নয়))

হিসাবে দেখানো হয় সবচেয়ে ভালো সমাধান, আপনার নিজের করা হয় এখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.