উত্তর:
না, cp
একাধিক উত্স অনুলিপি করতে পারে তবে কেবল একক গন্তব্যে অনুলিপি করবে। আপনি যা cp
করতে চান তার জন্য আপনাকে একবার - একবার গন্তব্য প্রতি একাধিকবার ডাকার ব্যবস্থা করতে হবে; আপনি যেমনটি বলেন, একটি লুপ বা অন্য কোনও সরঞ্জাম ব্যবহার করে।
আপনি cp
একা এটি করতে পারবেন না তবে আপনি এর cp
সাথে একত্রিত করতে পারেন xargs
:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
কপি হবে file1
থেকে dir1
, dir2
এবং dir3
। xargs
এটি করতে cp
3 বার কল করবে , বিশদটির জন্য ম্যান পৃষ্ঠাটি xargs
দেখুন।
cp
একা দিয়ে এটি করতে পারবেন না " অন্য কারণ হিসাবে প্রস্তাবের সাহায্যে উত্তরটি সাহায্য করার চেষ্টা করার অর্থ এই নয় যে প্রশ্নের উত্তর দেওয়া হয়নি।
echo dir[1-3] | xargs -n 1 cp filename
) পারেন।
ওয়াইল্ডকার্ডস রবার্টস কোড সহও কাজ করে
echo ./fs*/* | xargs -n 1 cp test
যতদূর আমি এটি দেখতে পাচ্ছি আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:
ls | xargs -n 1 cp -i file.dat
-i
বিকল্প cp
কমান্ড মানে আপনার সাথে বর্তমান ডিরেক্টরির মধ্যে একটি ফাইল ওভাররাইট করা হবে কিনা তা জিজ্ঞাসা করা হবে যে file.dat
। এটি সম্পূর্ণরূপে স্বয়ংক্রিয় সমাধান না হলেও এটি আমার জন্য কার্যকর হয়েছিল।
-i
গার্ডটি যুক্ত করা ভাল , তবে কি প্রতিটি ফাইল লেখার বিষয়ে আপনাকে জিজ্ঞাসা করবে না? ডিরেক্টরি কপি করার চেয়ে?
cp: overwrite
প্রশ্নগুলির একটি সিরিজ মুদ্রণ করেছে , তবে আমার কোনও উত্তর দেওয়ার দরকার নেই, এবং এটি ফাইলগুলি ওভাররাইট করে না।
আমি এর পরিবর্তে /superuser/32630/parallel-file-copy-from-single-source-to-mpleple-targets এ দেখেছি এমন উত্তরগুলি আমি ব্যবহার করব cat
এবং এর tee
ভিত্তিতে তৈরি করব ।cp
উদাহরণ স্বরূপ:
cat inputfile | tee outfile1 outfile2 > /dev/null
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
তাইউইর উত্তর দ্বারা প্রদর্শিত হিসাবে একটি দরকারী নিদর্শন। '<' এর সাথে আইও-পুনঃনির্দেশের ব্যবহারটি লক্ষ্য করুন যাতে বিড়াল থেকে পাইপিংয়ের প্রয়োজন হয় না।
প্রতি সেপি সিপি ব্যবহার করছেন না, তবে ...
এটি (ধীর) এসডি কার্ডের তিনটি (ধীর) ইউএসবি ড্রাইভে প্রচুর গোপ্রো ফুটেজ অনুলিপি করার প্রসঙ্গে আমার কাছে উপস্থিত হয়েছিল। আমি ডেটা একবারে পড়তে চেয়েছিলাম, কারণ এটি চিরতরে লেগেছিল। এবং আমি এটি পুনরাবৃত্তি চেয়েছিলেন।
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
(এবং যদি আপনি আরও আউটপুট চান তবে আপনি সেগুলিতে আরও বেশি (>) বিভাগ যুক্ত করতে পারেন))
আমি এটি বেঞ্চমার্ক করিনি, তবে এটি অবশ্যই সিপি-ইন-এ-লুপের (বা সমান্তরাল সিপি অনুরোধগুলির একটি গুচ্ছ) এর চেয়ে অনেক দ্রুত।
xargs
ম্যাক ওএসে ওয়াইল্ডকার্ড ব্যবহার করে ডিরেক্টরিতে অনুলিপি ব্যবহার করার জন্য, ডিরেক্টরি নামটিতে স্পেস দিয়ে আমার জন্য কাজ করা একমাত্র সমাধান হ'ল:
find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test
কোথায় test
কপি করতে ফাইল
এবং ./fs*/*
কপি করতে ডিরেক্টরি
সমস্যাটি হ'ল xargs স্পেসগুলি একটি নতুন যুক্তি হিসাবে দেখছে, ডিলিমিটার চরিত্রটি ব্যবহার করে সমাধান করার সমাধানগুলি সমাধান করে -d
বা -E
দুর্ভাগ্যক্রমে ম্যাক ওএসে সঠিকভাবে কাজ করছে না।
মূলত xargs উত্তরের সমতুল্য, তবে আপনি যদি সমান্তরাল সম্পাদনা চান:
parallel -q cp file1 ::: /foo/ /bar/
সুতরাং, উদাহরণস্বরূপ, বর্তমান ফোল্ডারের সমস্ত উপ-ডিরেক্টরিতে পুনরাবৃত্তি সহ ফাইল 1 অনুলিপি করতে:
parallel -q cp file1 ::: `find -mindepth 1 -type d`
নোট: এটি সম্ভবত খুব নির্দিষ্ট ব্যবহারের ক্ষেত্রে কোনও লক্ষণীয় গতির লাভ বোঝায়, উদাহরণস্বরূপ যদি প্রতিটি লক্ষ্য ডিরেক্টরিটি একটি পৃথক ডিস্ক থাকে।
এটি xargs এর জন্য '-P' যুক্তির সাথে কার্যত সমান।
না তুমি পারবে না.
আমি একাধিক অনুষ্ঠানে খুঁজে পেয়েছি যে আমি এই কার্যকারিতাটি ব্যবহার করতে পারি তাই আমার জন্য এটি করার জন্য আমি নিজের সরঞ্জাম তৈরি করেছি।
http://github.com/ddavison/branch
বেশ সহজ -
branch myfile dir1 dir2 dir3
/e
মেশিনে কেবল একবার ক্লাউড ওয়েব ডিরেক্টরি মাউন্ট করার কোনও উপায় ছিল , তবে আমি আমার নিজের পাওয়ারলগুলি লিখতে এবং সেগুলি চিরতরে রাখতে পারি।
ধরুন আপনি fileName.txt
বর্তমান ওয়ার্কিং ডিরেক্টরিতে থাকা সমস্ত উপ-ডিরেক্টরিতে অনুলিপি করতে চান ।
সমস্ত উপ-ডিরেক্টরি নামগুলির মাধ্যমে পান ls
এবং কিছু অস্থায়ী ফাইলে সেভ করুন বলুন,allFolders.txt
ls > allFolders.txt
তালিকাটি মুদ্রণ করুন এবং এটি কমান্ডে প্রেরণ করুন xargs
।
cat allFolders.txt | xargs -n 1 cp fileName.txt
আরও একটি উপায় হ'ল বিড়াল এবং টি নিম্নলিখিত পদ্ধতিতে ব্যবহার করুন:
cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>
আমি মনে করি এটি যদিও বেশ অকার্যকর হবে, যেহেতু কাজটি বিভিন্ন প্রক্রিয়ার মধ্যে ভাগ হয়ে যাবে (গন্তব্য প্রতি এক) এবং হার্ড ড্রাইভটি প্ল্যাটারের বিভিন্ন অংশে একবারে বিভিন্ন ফাইল লিখবে writing তবে আপনি যদি বিভিন্ন ফাইলকে কোনও ফাইল লিখতে চান তবে এই পদ্ধতিটি সম্ভবত বেশ দক্ষ হবে (যেহেতু সমস্ত অনুলিপি একই সাথে ঘটতে পারে)।
বাশ স্ক্রিপ্ট ব্যবহার করা
DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6
for (( i=0; i<NumberOfDestinations; i++))
do
cp SourcePath/fileName.ext ${DESTINATIONPATH[$i]}
done
exit
যদি আপনার সমস্ত টার্গেট ডিরেক্টরিগুলি কোনও পথের অভিব্যক্তির সাথে মেলে - যেমন সেগুলি সমস্ত সাবডাইরেক্টরি path/to
- তবে কেবল এই জাতীয় find
সংমিশ্রণে ব্যবহার করুন cp
:
find ./path/to/* -type d -exec cp [file name] {} \;
এটাই.
find
এবং থ্রেডে ব্যবহার করে অন্য প্রতিটি উত্তরে একটি ডাউন-ভোট দিয়েছিলেন ।
কোন ফোল্ডারটিতে ফাইলটি অনুলিপি করতে হবে তা সুনির্দিষ্ট করার দরকার থাকলে আপনি এক বা একাধিক গ্রেপের সাথে সন্ধানটি একত্রিত করতে পারেন। উদাহরণস্বরূপ যে কোনও সাবফোল্ডারটি আপনি ব্যবহার করতে পারেন তাতে ফেভিকন.ইকো এর যেকোন ঘটনা প্রতিস্থাপন করতে:
find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico
এটি তাত্ক্ষণিক সাব-ডিরেক্টরিগুলিতে অনুলিপি করবে, আপনি যদি আরও গভীরতর হতে চান তবে -maxdepth
প্যারামিটারটি সামঞ্জস্য করুন ।
find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html
আপনি যদি সমস্ত ডিরেক্টরিতে অনুলিপি না চান তবে আশা করি আপনি যে ডিরেক্টরিগুলি আগ্রহী নন সেগুলি আপনি ফিল্টার করতে পারবেন Example উদাহরণস্বরূপ সমস্ত ফোল্ডারে অনুলিপি শুরু করা a
find . -mindepth 1 -maxdepth 1 -type d| grep \/a |xargs -n 1 cp -i index.html
ডিরেক্টরিগুলির একটি স্বেচ্ছাসেবী / বিচ্ছিন্ন সেটগুলিতে অনুলিপি করাতে আপনার রবার্ট গাম্বলের পরামর্শ প্রয়োজন।
আমি একাধিক ডিরেক্টরিতে কোনও ফাইল অনুলিপি করতে চাই:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
এবং ডিরেক্টরিটি অন্য ডিরেক্টরিতে অনুলিপি করে:
cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
আমি জানি এটি বেশ কয়েকটি কমান্ড জারি করার মতো, তবে যখন আমি 1 লাইন টাইপ করতে এবং কিছুক্ষণ দূরে যেতে চাই তখন এটি আমার পক্ষে ভাল কাজ করে।
উদাহরণস্বরূপ, আপনি যদি গন্তব্য ফোল্ডারগুলির মূল ডিরেক্টরিতে থাকেন তবে আপনি এটি করতে পারেন:
আমি $ (ls) এর জন্য; সিপি সোর্সফিল করুন $ i; সম্পন্ন
ls
, এবং সর্বদা ভেরিয়েবল উদ্ধৃত। for i in ./*; do cp sourcefile "$i"; done