সিপি ব্যবহার করে কীভাবে কোনও ফোল্ডারকে পুনরাবৃত্তভাবে অনুলিপি করতে হবে?


46

আমি যখন ব্যবহার করি

cp -R inputFolder outputFolder

ফলাফলটি প্রাসঙ্গিক-নির্ভর :

  1. যদি outputFolderঅস্তিত্ব না থাকে তবে এটি তৈরি করা হবে এবং ক্লোন্ড ফোল্ডার পাথ হবে outputFolder
  2. যদি outputFolderউপস্থিত থাকে তবে তৈরি ক্লোনটি হবেoutputFolder/inputFolder

এটি ভয়াবহ , কারণ আমি কিছু ইনস্টলেশন স্ক্রিপ্ট তৈরি করতে চাই এবং ব্যবহারকারী যদি ভুল করে এটি দু'বার চালায় তবে তিনি outputFolderপ্রথমবার তৈরি করে ফেলবেন, দ্বিতীয় বারে আবার সমস্ত জিনিস আবার তৈরি হবে outputFolder/inputFolder

  • আমি সর্বদা প্রথম আচরণটি চাই: মূলটির (ক্লোবা হিসাবে) পাশে একটি ক্লোন তৈরি করুন।
  • আমি cpপোর্টেবল হতে ব্যবহার করতে চাই (উদাহরণস্বরূপ মিংডাব্লু rsyncপাঠানো হয়নি)
  • আমি যাচাই করেছিলাম cp -R --parentsতবে এটি ডিরেক্টরি ট্রি পর্যন্ত পুরো পথটি পুনরায় তৈরি করে (যাতে ক্লোনটি outputFolderকিন্তু হবে না some/path/outputFolder)
  • --remove-destinationবা --updateক্ষেত্রে 2 কিছু পরিবর্তন না করে, তবুও জিনিসগুলিতে অনুলিপি করা হয়outputFolder/inputFolder

এর অস্তিত্বের জন্য প্রথমে outputFolder(যদি ফোল্ডারটি তখন উপস্থিত না থাকে ...) বা ব্যবহার না করে এটি করার উপায় আছে rm -rf outputFolder?

এটি করার সম্মত, বহনযোগ্য ইউনিক্স উপায় কী?



2
এই বিকল্পগুলির মধ্যে কয়েকটি পসিক্স নয়, সুতরাং আপনি যেগুলি চেষ্টা করেছেন সেগুলি খুব পোর্টেবল নয়। আপনি যদি সামান্য বহনযোগ্যতার অভাব নিয়ে বেঁচে থাকতে পারেন তবে কেন ব্যবহার rsyncকরবেন না ?
মুরু

1
আপনার যদি ব্যবহারের প্রয়োজন না cpহয় তবে দুটি tarকমান্ডের মধ্যে পাইপ দেওয়া গাছগুলি অনুলিপি করার একটি দুর্দান্ত নির্ভরযোগ্য উপায়।
আর ..

@ আর .. আপনি একটি উদাহরণ দিতে পারেন? @ মুরু আমি এটি এমএনডাব্লুতে কাজ করতে চাই যা rsyncপাঠানো হয়নি।
jakub.g

জিএনইউ টার সাথে, tar -C input -cf - . | tar -C output -xf -কাজ করে। -Cওয়ার্কিং ডিরেক্টরি পরিবর্তন করে, তবে এটি একটি আদর্শ বিকল্প নয়, সুতরাং যদি এটি সমর্থন না করে তবে আপনার সঠিক দুটি ডাইরেক্টরিগুলি শুরু করার জন্য ডাইরেক্ট ওয়ার্কিং ডিরেক্টর চালনা করতে হবে, উদাহরণস্বরূপ ( cd input && tar -cf - . ) | ( cd output && tar -xf - )আপনি উইন্ডোজের সাথে যদি ডিল করছেন তবে আমি কেবল রোইমার উত্তরটি ব্যবহার করব।
আর ..

উত্তর:


54

পরিবর্তে এটি ব্যবহার করুন:

cp -R inputFolder/. outputFolder

এটি ঠিক একইভাবে কাজ করে যা বলে, cp -R aaa/bbb cccকাজ করে: যদি cccনা থাকে তবে এটি এর অনুলিপি bbbএবং এর বিষয়বস্তু হিসাবে তৈরি করা হয়েছে ; তবে যদি cccইতিমধ্যে বিদ্যমান থাকে তবে ccc/bbbএর অনুলিপি bbbএবং এর বিষয়বস্তু হিসাবে তৈরি করা হয়েছে ।

এর প্রায় কোনও উদাহরণের জন্য bbbআপনি আপনার প্রশ্নে উল্লেখ করেছেন এমন অনাকাঙ্ক্ষিত আচরণ দেয়। যাইহোক, এই নির্দিষ্ট অবস্থায় bbbঠিক হয় ., তাই aaa/bbbসত্যিই aaa/., ঘুরে সত্যিই ঠিক যার aaaকিন্তু অন্য নামে। সুতরাং আমাদের এই দুটি দৃশ্য আছে:

  1. ccc এটির অস্তিত্ব নেই:

    কমান্ড cp -R aaa/. cccমানে "তৈরি cccএবং বিষয়বস্তু কপি aaa/.মধ্যে ccc/., অর্থাত্ কপি aaaমধ্যে ccc

  2. ccc বিদ্যমান:

    কমান্ড cp -R aaa/. cccমানে হলো "বিষয়বস্তু কপি aaa/.মধ্যে ccc/., অর্থাত্ কপি aaaমধ্যে ccc


3
হু, এটি আমার জন্য নতুন, তবে এটি কাজ করে বলে মনে হচ্ছে না! এটি কোথাও নথিভুক্ত?
ইলমারি করোনেন

1
আমি এর inputFolder/.পরিবর্তে পরীক্ষা করেছি inputFolderএবং সত্যই এটি উইন্ডোজ / গিট বাশে আমার জন্য কাজ করে। (এটি কেবল অনুসরণের সাথে কাজ করে না /, স্ল্যাশের পরে আমারও বিন্দুর প্রয়োজন)। এটি আকর্ষণীয়
হওয়ায়

@ ইলমারি জারোনেন এটিকে স্পষ্টভাবে নথিভুক্ত করার দরকার নেই। ব্যাখ্যাটি অনুসরণ করুন এবং আপনি দেখতে পাবেন যে কীভাবে এটি "নিয়ম অনুসরণ করে"।
রোয়াইমা

18

ফোল্ডারটি অনুলিপি করবেন না, কেবল সামগ্রীগুলি অনুলিপি করুন:

## Create the target directory. The -p suppresses error messages
## if the directory already exists
mkdir -p outputFolder

## Copy the contents recursively, this will not recreate the parent
cp -R inputfolder/* outputfolder/

এইভাবে আপনি উভয়ই নিশ্চিত হন যে স্ক্রিপ্টটি প্রথমবারের মতো সঞ্চালিত হওয়ার পরে লক্ষ্য ডিরেক্টরিটি তৈরি করা হয়েছে এবং দ্বিতীয়বার এটি চালানোর সময় সমস্যাটি এড়ানো উচিত।

ক্রিস ডাউন খুব সঠিকভাবে উল্লেখ করেছেন যে ব্যাশে, এটি এমন ফাইলগুলি এড়িয়ে যাবে যার নাম দিয়ে শুরু হয় .। এটি এড়াতে আপনি shopt -s dotglobউপরের কমান্ডটি চালানোর আগে চালাতে পারেন ।

উভয় -pজন্যmkdir এবং -Rজন্যcp POSIX দ্বারা সংজ্ঞায়িত করা হয় তাই এই পুরোপুরি পোর্টেবল হওয়া উচিত।


6
দ্রষ্টব্য: এটি দিয়ে ফাইলগুলি অনুলিপি করবে না .। ব্যাশে, আপনি এটির dotglobজন্য ব্যবহার করতে পারেন ।
ক্রিস ডাউন

2
নোট করুন যদি ইনপুটফোল্ডারে ডিরেক্টরি প্রবেশের সংখ্যাটি বড় হয় তবে এই পদ্ধতিটি ব্যর্থ হতে পারে, কারণ গ্লোব সম্প্রসারণ সর্বাধিক কমান্ড লাইনের দৈর্ঘ্য ছাড়িয়ে যেতে পারে।
টিম কাটস

11

-Tবিকল্পটি চেষ্টা করে দেখুন cp। এটি জিএনইউ কোর্টিলস cpসংস্করণ 8.22 এ বিদ্যমান ; এটি এর বাইরে বহনযোগ্য নাও হতে পারে।


1
হ্যাঁ, মনে হচ্ছে এটি ঠিক আমি চেয়েছিলাম: cp -T( cp --no-target-directory)। unix.stackexchange.com/questions/94831/… দুর্ভাগ্যক্রমে আমার সংস্করণটি cpঅনেক পুরানো।
jakub.g

1
+1 ঠিক এটি আজ ব্যবহার করা হয়েছে। -uএটি অলস করতে যুক্ত করার জন্য একটি দুর্দান্ত বিকল্প।
পিএসকোকিক

4

আপনি এটি ব্যবহার করতে পারেন rsync:

rsync -uav inputFolder/ outputFolder/

(স্ল্যাশগুলি লক্ষ্য করুন, বিশেষত প্রথমটির পরে)


0

আমার মতে, এর চেয়ে সহজ এবং বহনযোগ্য আর কিছুই নেই rm -rf outputFolder। সুতরাং, আমি সর্বদা এটির সাথে থাকি। আমি বুঝতে পারি যে আপনার প্রশ্নটি আলাদা, তবে আমি মনে করি এটিই সেরা অনুশীলন।


লক্ষ্যমাত্রায় নির্দিষ্ট অনুমতি বা মালিকানা রাখার প্রয়োজন থাকলে এটি ব্যর্থ হয়। বা এটি যদি একটি সিলেমিংক হয়।
রোয়াইমা

1
cpডিরেক্টরিটি যখন ডিরেক্টরিটি বিদ্যমান না থাকে এবং কখন বিদ্যমান থাকে তখন উভয়ই ফলাফলটি একই হতে চায় । তো, আপনি কি সম্পর্কে কথা বলছেন?
দশোহক্সা

cpকমান্ড হিসাবে ওপি কর্তৃক প্রদত্ত অনুমতির (অথবা টাইমস্ট্যাম্প) রাখা হয় না।
রোয়াইমা

0

আপনি কমান্ডের -tবিকল্পটি ব্যবহার করতে পারেন cp:

cp -R inputFolder -t outputFolder

এখন যদি লক্ষ্য ফোল্ডারটি উপস্থিত না থাকে তবে এটি একটি ত্রুটি নিক্ষেপ করবে:

cp: failed to access ‘outputFolder’: No such file or directory

উপরের নোটটি নোটটি inputFolderএর বিষয়বস্তু সহ অনুলিপি করবে (এবং কেবল এটির ভিতরে থাকা সামগ্রীগুলি নয়)

যদি আপনি কেবল এর বিষয়বস্তু অনুলিপি করতে চান তবে inputFolderকিছুটা জটিল হয়ে ওঠে (যেহেতু তারকাচিহ্ন ব্যবহার করার সময় শেল গ্লোব্বিং ব্যবহার করার সময় আপনার যত্নবান হতে হবে *)

cp -R  -t outputFolder/ -- inputFolder/*

এখন যদি লক্ষ্য ফোল্ডারটি উপস্থিত না থাকে তবে এটি একটি ত্রুটি নিক্ষেপ করবে:

cp: failed to access ‘outputFolder’: No such file or directory

সঙ্গে কাজ করে cp (GNU coreutils) 8.23

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