Gnu cp কমান্ড ব্যবহার করে কীভাবে একাধিক ডিরেক্টরিতে একটি ফাইল অনুলিপি করবেন


210

সিপি কমান্ড ব্যবহার করে একাধিক ডিরেক্টরিতে কোনও একক ফাইল অনুলিপি করা সম্ভব?

আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম, যা কার্যকর হয়নি:

cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}

আমি জানি এটি লুপের জন্য ব্যবহার করা বা অনুসন্ধান করা সম্ভব। তবে gnu cp কমান্ড ব্যবহার করা কি সম্ভব?

উত্তর:


106

না, cpএকাধিক উত্স অনুলিপি করতে পারে তবে কেবল একক গন্তব্যে অনুলিপি করবে। আপনি যা cpকরতে চান তার জন্য আপনাকে একবার - একবার গন্তব্য প্রতি একাধিকবার ডাকার ব্যবস্থা করতে হবে; আপনি যেমনটি বলেন, একটি লুপ বা অন্য কোনও সরঞ্জাম ব্যবহার করে।


উত্তর করার জন্য ধন্যবাদ! এখন যেহেতু আমি এটি সম্পর্কে আরও কিছু চিন্তা করি, অতিরিক্ত পতাকা ব্যতীত (যা বিদ্যমান নেই) সিপি জানতে পারবে না উত্সটি কী এবং ডিএসটি ডিয়ার কী।
টম ফিনার

10
এটি সঠিক উত্তর নয়। দয়া করে রবার্ট গাম্বলের উত্তর দেখুন।
প্লেগহ্যামার

23
@ নচটার্ন: আমি যা বলেছিলাম তার কোন অংশটি ভুল? আমার পরামর্শ অনুসারে রবার্ট সিপিকে একাধিকবার আবেদন করার জন্য অন্য একটি সরঞ্জাম ব্যবহার করার উদাহরণ দেয়। এমন অনেকগুলি সম্ভাব্য সমাধান রয়েছে যা অন্যান্য সরঞ্জাম বা নির্মাণের জন্য এটি ব্যবহার করতে জড়িত তবে ওপি নির্দেশ করে যে তিনি ইতিমধ্যে সচেতন যে এটি সম্ভব that
শে

2
দুঃখের বিষয়, সিপি (এবং স্কিপি) এর পক্ষে এই বৈশিষ্ট্যটি সমর্থন করা দুর্দান্ত। তবুও আমরা বিভাজন করতে টি ব্যবহার করতে পারি। superuser.com/questions/32630/…
সাইমন

4
@ মুনশাদো: অবশ্যই আপনার উত্তরটি সঠিক। আমি মনে করি প্লেগহ্যামার বলতে চাই যে এই প্রসঙ্গে অন্য উত্তরটি আরও কার্যকর। সম্ভবত আপনি নিজের উত্তরেও এরকম কিছু অন্তর্ভুক্ত করতে পারেন?
শান্তিপূর্ণ

585

আপনি cpএকা এটি করতে পারবেন না তবে আপনি এর cpসাথে একত্রিত করতে পারেন xargs:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

কপি হবে file1থেকে dir1, dir2এবং dir3xargsএটি করতে cp3 বার কল করবে , বিশদটির জন্য ম্যান পৃষ্ঠাটি xargsদেখুন।


3
Xargs সম্পর্কে আরও তথ্য: cyberciti.biz/faq/…
ক্রিস বিয়ার

24
@ সিমন কিভাবে? "আপনি cpএকা দিয়ে এটি করতে পারবেন না " অন্য কারণ হিসাবে প্রস্তাবের সাহায্যে উত্তরটি সাহায্য করার চেষ্টা করার অর্থ এই নয় যে প্রশ্নের উত্তর দেওয়া হয়নি।
নিকোল

3
@ নিকসি প্রশ্নকর্তা নির্দিষ্ট করেছেন: "আমি জানি এটি লুপের জন্য ব্যবহার করা বা খুঁজে পাওয়া সম্ভব But তবে gnu cp কমান্ডটি ব্যবহার করা কি সম্ভব?" উত্তম উত্তরটি হ'ল গৃহীত।
সাইমন 21

25
উত্তরগুলি যে তারা প্রযুক্তিগতভাবে প্রশ্নের উত্তর দেয় না তা নির্ভর করে স্বীকৃত হবে পেডেন্টিক এবং সত্যই কার্যকর নয়।
ব্যাকগ্যামন

4
খুব উপকারী! আমার মতো অন্যান্য নতুনদের জন্য: আপনি সিপির সাহায্যে রেজেেক্স ব্যবহার করতে পারবেন না, তবে আপনি এই কমান্ডের প্রথম অংশে (উদাহরণস্বরূপ echo dir[1-3] | xargs -n 1 cp filename) পারেন।
জেসন

77

ওয়াইল্ডকার্ডস রবার্টস কোড সহও কাজ করে

echo ./fs*/* | xargs -n 1 cp test 

এবং সম্পূর্ণ মন্তব্য ... উদাহরণস্বরূপ, আমার ডেস্কটপে থাকা সমস্ত ব্যবহারকারীর ডেস্কটপে একটি রুট-মালিকানাধীন ফাইল (আসলে একটি সিমলিংক) স্থানান্তরিত করতে আমি প্রথমে sudo su (অন্যথায় কাজ করিনি) ব্যবহার করতে পেরেছিলাম: তারপর ইকো / হোম / * / ডেস্কটপ / | xargs -n 1 cp -av / home / myusername / ডেস্কটপ / ফাইল।
ডেভিড জি

19

যতদূর আমি এটি দেখতে পাচ্ছি আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

ls | xargs -n 1 cp -i file.dat

-iবিকল্প cpকমান্ড মানে আপনার সাথে বর্তমান ডিরেক্টরির মধ্যে একটি ফাইল ওভাররাইট করা হবে কিনা তা জিজ্ঞাসা করা হবে যে file.dat। এটি সম্পূর্ণরূপে স্বয়ংক্রিয় সমাধান না হলেও এটি আমার জন্য কার্যকর হয়েছিল।


1
-iগার্ডটি যুক্ত করা ভাল , তবে কি প্রতিটি ফাইল লেখার বিষয়ে আপনাকে জিজ্ঞাসা করবে না? ডিরেক্টরি কপি করার চেয়ে?
হেজেহোগ

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

2
আমার জন্য, এটি cp: overwriteপ্রশ্নগুলির একটি সিরিজ মুদ্রণ করেছে , তবে আমার কোনও উত্তর দেওয়ার দরকার নেই, এবং এটি ফাইলগুলি ওভাররাইট করে না।
এভেজেনি সার্জিভ

এছাড়াও ':' চরিত্রের সাথে ':' চরিত্রের সাথে দায়েরের সাথে ফাইল করার জন্য একাধিক প্রশ্ন ছাপা হয়েছে, কার্যকরী কোনও সমাধান নেই, পলের সমাধান পুরোপুরি কাজ করছে
jgpATs2w

19

আমি এর পরিবর্তে /superuser/32630/parallel-file-copy-from-single-source-to-mpleple-targets এ দেখেছি এমন উত্তরগুলি আমি ব্যবহার করব catএবং এর teeভিত্তিতে তৈরি করব ।cp

উদাহরণ স্বরূপ:

cat inputfile | tee outfile1 outfile2 > /dev/null

1
আমার গন্তব্যগুলি বিভিন্ন শারীরিক ড্রাইভ (কোনও ডিজিটাল ফিল্মের জন্য উত্সের ভিডিওর মতো কোনও ফাইলের দুটি ভৌত ​​অনুলিপি রাখার জন্য) যদি আমি সবেমাত্র চালিয়ে গিয়েছি তবে একটি পরীক্ষামূলক পরীক্ষার এটি সেরা পারফরমার হিসাবে দেখায়।
কুরিউসার

1
আপনি যদি বাশ 3.0.০ বা তার বেশি ব্যবহার করেন তবে আপনি নিম্নরূপ ব্যবহার করতে পারেন:cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
স্যামুয়েল

tee < inputfile outfile1 outfile2 > /dev/nullতাইউইর উত্তর দ্বারা প্রদর্শিত হিসাবে একটি দরকারী নিদর্শন। '<' এর সাথে আইও-পুনঃনির্দেশের ব্যবহারটি লক্ষ্য করুন যাতে বিড়াল থেকে পাইপিংয়ের প্রয়োজন হয় না।
অ্যালেক্স টেলন

10

এই উত্তরগুলি সুস্পষ্টর চেয়ে আরও জটিল বলে মনে হচ্ছে:

for i in /foo /bar; do cp "$file1" "$i"; done

বর্তমান দির সমস্ত ডিরেক্টরিতে এটি করার জন্য একটি মার্জিত এবং কাজ করছে, এটি ব্যবহার করতে পারেনfor d in */ ; do cp $file "$i" done
FantomX1

9

ls -db di*/subdir | xargs -n 1 cp File

-bডিরেক্টরি নামের ক্ষেত্রে যদি স্থান থাকে অন্যথায় এটি xargs দ্বারা আলাদা আইটেম হিসাবে ভেঙে ফেলা হবে, প্রতিধ্বনি সংস্করণে এই সমস্যা ছিল


6

প্রতি সেপি সিপি ব্যবহার করছেন না, তবে ...

এটি (ধীর) এসডি কার্ডের তিনটি (ধীর) ইউএসবি ড্রাইভে প্রচুর গোপ্রো ফুটেজ অনুলিপি করার প্রসঙ্গে আমার কাছে উপস্থিত হয়েছিল। আমি ডেটা একবারে পড়তে চেয়েছিলাম, কারণ এটি চিরতরে লেগেছিল। এবং আমি এটি পুনরাবৃত্তি চেয়েছিলেন।

$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )

(এবং যদি আপনি আরও আউটপুট চান তবে আপনি সেগুলিতে আরও বেশি (>) বিভাগ যুক্ত করতে পারেন))

আমি এটি বেঞ্চমার্ক করিনি, তবে এটি অবশ্যই সিপি-ইন-এ-লুপের (বা সমান্তরাল সিপি অনুরোধগুলির একটি গুচ্ছ) এর চেয়ে অনেক দ্রুত।


5

xargsম্যাক ওএসে ওয়াইল্ডকার্ড ব্যবহার করে ডিরেক্টরিতে অনুলিপি ব্যবহার করার জন্য, ডিরেক্টরি নামটিতে স্পেস দিয়ে আমার জন্য কাজ করা একমাত্র সমাধান হ'ল:

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test 

কোথায় testকপি করতে ফাইল
এবং ./fs*/*কপি করতে ডিরেক্টরি

সমস্যাটি হ'ল xargs স্পেসগুলি একটি নতুন যুক্তি হিসাবে দেখছে, ডিলিমিটার চরিত্রটি ব্যবহার করে সমাধান করার সমাধানগুলি সমাধান করে -dবা -Eদুর্ভাগ্যক্রমে ম্যাক ওএসে সঠিকভাবে কাজ করছে না।


4

আপনি যদি কাঁটাচামচা আদেশ ছাড়া এটি করতে চান:

tee <inputfile file2 file3 file4 ... >/dev/null


2

মূলত xargs উত্তরের সমতুল্য, তবে আপনি যদি সমান্তরাল সম্পাদনা চান:

parallel -q cp file1 ::: /foo/ /bar/

সুতরাং, উদাহরণস্বরূপ, বর্তমান ফোল্ডারের সমস্ত উপ-ডিরেক্টরিতে পুনরাবৃত্তি সহ ফাইল 1 অনুলিপি করতে:

parallel -q cp file1 ::: `find -mindepth 1 -type d`

নোট: এটি সম্ভবত খুব নির্দিষ্ট ব্যবহারের ক্ষেত্রে কোনও লক্ষণীয় গতির লাভ বোঝায়, উদাহরণস্বরূপ যদি প্রতিটি লক্ষ্য ডিরেক্টরিটি একটি পৃথক ডিস্ক থাকে।

এটি xargs এর জন্য '-P' যুক্তির সাথে কার্যত সমান।


0

না তুমি পারবে না.

আমি একাধিক অনুষ্ঠানে খুঁজে পেয়েছি যে আমি এই কার্যকারিতাটি ব্যবহার করতে পারি তাই আমার জন্য এটি করার জন্য আমি নিজের সরঞ্জাম তৈরি করেছি।

http://github.com/ddavison/branch

বেশ সহজ -
branch myfile dir1 dir2 dir3


প্রায়শই এমন পরিস্থিতিতে রয়েছে যেখানে আমি আমার নিজস্ব স্ক্রিপ্টটি লিখতাম, তবে আমি আজকাল এতগুলি মেশিন ব্যবহার করার ঝোঁক রাখি যে সেগুলি সবগুলিকে সিঙ্কে রাখাই একটি বড় ঝামেলা বলে মনে হচ্ছে। যদি কেবল কোনও /eমেশিনে কেবল একবার ক্লাউড ওয়েব ডিরেক্টরি মাউন্ট করার কোনও উপায় ছিল , তবে আমি আমার নিজের পাওয়ারলগুলি লিখতে এবং সেগুলি চিরতরে রাখতে পারি।
এভেজেনি সার্জিভ


0

ধরুন আপনি fileName.txtবর্তমান ওয়ার্কিং ডিরেক্টরিতে থাকা সমস্ত উপ-ডিরেক্টরিতে অনুলিপি করতে চান ।

  1. সমস্ত উপ-ডিরেক্টরি নামগুলির মাধ্যমে পান lsএবং কিছু অস্থায়ী ফাইলে সেভ করুন বলুন,allFolders.txt

    ls > allFolders.txt
  2. তালিকাটি মুদ্রণ করুন এবং এটি কমান্ডে প্রেরণ করুন xargs

    cat allFolders.txt | xargs -n 1 cp fileName.txt

0

আরও একটি উপায় হ'ল বিড়াল এবং টি নিম্নলিখিত পদ্ধতিতে ব্যবহার করুন:

cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>

আমি মনে করি এটি যদিও বেশ অকার্যকর হবে, যেহেতু কাজটি বিভিন্ন প্রক্রিয়ার মধ্যে ভাগ হয়ে যাবে (গন্তব্য প্রতি এক) এবং হার্ড ড্রাইভটি প্ল্যাটারের বিভিন্ন অংশে একবারে বিভিন্ন ফাইল লিখবে writing তবে আপনি যদি বিভিন্ন ফাইলকে কোনও ফাইল লিখতে চান তবে এই পদ্ধতিটি সম্ভবত বেশ দক্ষ হবে (যেহেতু সমস্ত অনুলিপি একই সাথে ঘটতে পারে)।


0

বাশ স্ক্রিপ্ট ব্যবহার করা

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

আমি এটিকে ডাউনটা দিয়েছি। প্রশ্নটি বিশেষত একটি নন-লুপ সমাধানের জন্য জিজ্ঞাসা করেছিল।
অ্যালেক্স টেলন

-1

আপনি যদি একাধিক ফোল্ডারগুলিকে একাধিক ফোল্ডারে অনুলিপি করতে চান তবে এই জাতীয় কিছু করতে পারেন:

প্রতিধ্বনি dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1, subdir2, subdir3}


-1

যদি আপনার সমস্ত টার্গেট ডিরেক্টরিগুলি কোনও পথের অভিব্যক্তির সাথে মেলে - যেমন সেগুলি সমস্ত সাবডাইরেক্টরি path/to- তবে কেবল এই জাতীয় findসংমিশ্রণে ব্যবহার করুন cp:

find ./path/to/* -type d -exec cp [file name] {} \;

এটাই.


আমি এটিকে ডাউনটা দিয়েছি। প্রশ্নটি বিশেষত একটি অ-সন্ধানের সমাধানের জন্য জিজ্ঞাসা করেছিল।
অ্যালেক্স টেলন

অ্যালেক্সটেলন এতোটাই পুঙ্খানুপুঙ্খভাবে থাকার জন্য আপনাকে ধন্যবাদ। আমার ধারণা আমি খুব মিস করেছি আমি আশা করি আপনিও সামঞ্জস্য বজায় রেখেছিলেন findএবং থ্রেডে ব্যবহার করে অন্য প্রতিটি উত্তরে একটি ডাউন-ভোট দিয়েছিলেন ।
Mig82

-2

কোন ফোল্ডারটিতে ফাইলটি অনুলিপি করতে হবে তা সুনির্দিষ্ট করার দরকার থাকলে আপনি এক বা একাধিক গ্রেপের সাথে সন্ধানটি একত্রিত করতে পারেন। উদাহরণস্বরূপ যে কোনও সাবফোল্ডারটি আপনি ব্যবহার করতে পারেন তাতে ফেভিকন.ইকো এর যেকোন ঘটনা প্রতিস্থাপন করতে:

find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico

-3

এটি তাত্ক্ষণিক সাব-ডিরেক্টরিগুলিতে অনুলিপি করবে, আপনি যদি আরও গভীরতর হতে চান তবে -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

ডিরেক্টরিগুলির একটি স্বেচ্ছাসেবী / বিচ্ছিন্ন সেটগুলিতে অনুলিপি করাতে আপনার রবার্ট গাম্বলের পরামর্শ প্রয়োজন।


-3

আমি একাধিক ডিরেক্টরিতে কোনও ফাইল অনুলিপি করতে চাই: 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 লাইন টাইপ করতে এবং কিছুক্ষণ দূরে যেতে চাই তখন এটি আমার পক্ষে ভাল কাজ করে।


7
আপনি 6 বছরের পুরানো প্রশ্নের 15 টি উত্তর দিয়ে উত্তর দিচ্ছেন। আপনার উত্তরটি সুন্দর উপন্যাস হওয়া দরকার। আমার মতামত - এটা না।
ক্রেগ এস। অ্যান্ডারসন

-4

উদাহরণস্বরূপ, আপনি যদি গন্তব্য ফোল্ডারগুলির মূল ডিরেক্টরিতে থাকেন তবে আপনি এটি করতে পারেন:

আমি $ (ls) এর জন্য; সিপি সোর্সফিল করুন $ i; সম্পন্ন


প্রশ্নটি বলে যে এটি লুপের সাহায্যে সম্ভব, সুতরাং এটি সত্যিই কিছু যুক্ত করে না।
LJNielsenDk

Downvoted। কখনও আউটপুট পার্স করার চেষ্টা করবেন নাls , এবং সর্বদা ভেরিয়েবল উদ্ধৃত। for i in ./*; do cp sourcefile "$i"; done
sleblanc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.