'সিপিকে' কীভাবে বাধ্যতামূলকভাবে ডিরেক্টরিটির ভিতরে অন্য একটি তৈরি করার পরিবর্তে ওভাররাইট করা যায়?


107

আমি একটি বাশ স্ক্রিপ্ট লেখার চেষ্টা করছি যা একটি বিদ্যমান ডিরেক্টরিকে ওভাররাইট করবে। আমার একটি ডিরেক্টরি আছে foo/এবং আমি bar/এটি দিয়ে ওভাররাইট করার চেষ্টা করছি । তবে আমি যখন এটি করি:

cp -Rf foo/ bar/

একটি নতুন bar/foo/ডিরেক্টরি তৈরি করা হয়। আমি এটা চাই না। এখানে দুটি ফাইল রয়েছে foo/; aএবং bbar/পাশাপাশি একই নামের ফাইল রয়েছে । আমি চাই foo/aএবং foo/bপ্রতিস্থাপন bar/aএবং bar/b

উত্তর:


122

আপনি -Tবিকল্পটি ব্যবহার করে এটি করতে পারেন cp
জন্য ম্যান পৃষ্ঠা দেখুন cp

-T, --no-target-directory
    treat DEST as a normal file

আপনার উদাহরণ হিসাবে সুতরাং, নিম্নলিখিত ফাইল কাঠামো।

$ tree test
test
|-- bar
|   |-- a
|   `-- b
`-- foo
    |-- a
    `-- b
2 directories, 4 files

আপনি -vভার্বোজের জন্য ব্যবহার করার সময় আপনি স্পষ্ট পার্থক্য দেখতে পাবেন ।
যখন আপনি কেবল -Rবিকল্পটি ব্যবহার করবেন ।

$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
 $ tree
 |-- bar
 |   |-- a
 |   |-- b
 |   `-- foo
 |       |-- a
 |       `-- b
 `-- foo
     |-- a
     `-- b
3 directories, 6 files

আপনি যখন বিকল্পটি ব্যবহার করেন তখন -Tএটি বিষয়বস্তুগুলিকে ওভাররাইট করে, গন্তব্যটিকে একটি সাধারণ ফাইলের মতো চিকিত্সা করে ডিরেক্টরি হিসাবে নয়

$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'

$ tree
|-- bar
|   |-- a
|   `-- b
`-- foo
    |-- a
    `-- b
2 directories, 4 files

এটা আপনার সমস্যা সমাধান করবে.


22
ধরো যদি কেউ এই দ্বারা আপ হোঁচট খেয়েছি হয় এটা করবে ওএসএক্স CP সঙ্গে কাজ করে না developer.apple.com/library/mac/documentation/Darwin/Reference/...
dnfehren

9
এটা স্পষ্ট নয় যে, এই উত্তর কি ওপি, জন্য খুঁজছেন হয়, যদিও দেওয়া উপরোক্ত উদাহরণ সমস্যা মাস্ক ... -T বিকল্প, ফাইল একটি বিদ্যমান টার্গেট (হয় সাথে আছেন bar/) কিন্তু না উৎস (মধ্যে foo/) ছেড়ে দেওয়া হবে জায়গায়, তাই অধিকাংশ লোকেরা ডিরেক্টরিটির একটি সম্পূর্ণ ওভাররাইট বিবেচনা করবেন। অর্থাত। যদি bar/bazইতিমধ্যে অস্তিত্ব থাকে তবে এরপরেও এটি বিদ্যমান থাকবে ...
রোবো

1
এই উত্তরটি অপটির প্রশ্নের উত্তর দেয় তবে গন্তব্যটি ইতিমধ্যে উপস্থিত রয়েছে এবং আপনি এতে থাকা সামগ্রীগুলি সরাতে চান তবে উত্স ডিরেক্টরিটি তা দেয় না তবে সেই ক্ষেত্রে সমাধান করে না। এটি এক জায়গা থেকে অন্য জায়গায় ফাইল অনুলিপি করার একটি প্রত্যাশিত আচরণ নয়। এটি কেবল উত্সতে থাকা লক্ষ্যযুক্ত জিনিসগুলিতেই ওভাররাইট করে, এটি উত্সটিতে নেই এমন টার্গেটের কোনও কিছুই স্পর্শ করে না। এটি করার জন্য একটি আদেশ rm -rf bar/* && cp -TRv foo/ bar/
প্রিপেন্ড

1
আমি একটি মন পাঠক নই ... আমি আরও ব্যাখ্যা কি ওপি খুঁজছেন ছিল দেখতে না পান, কিন্তু এই স্পষ্টভাবে উত্তর দিই যে আমি (MEEEE) খুঁজছেন ছিল
Assimilater

2
সর্বাধিক উত্সাহিত মন্তব্যে যে লিঙ্কটি কাজ করছে না তার মাধ্যমে যদি কেউ কাউকে বিভক্ত করে তোলে তবে
সালফার ২

48

এটি দুটি পদক্ষেপে করুন।

rm -r bar/
cp -r foo/ bar/

11
এটি এখনও পর্যন্ত দেওয়া একমাত্র উদাহরণ যা নিশ্চিত করবে যে barএটি সামগ্রীতে অভিন্ন foo, fooপ্লাসে থাকা অন্যান্য আইটেমগুলির আইটেমের সংমিশ্রণ নয় যা ইতিমধ্যে বিদ্যমান রয়েছে bar। নীচে @ সৌরভ মেশরামের উচ্চ আপত্তিকৃত উত্তরটিতে এই সমস্যা রয়েছে।
robo

1
অতিরিক্ত এই ব্যবহার করে, যেমন সতর্কতা অবলম্বন করা আবশ্যক হবে দণ্ড, এমনকি গোপন বেশী থেকে সব ফাইল মুছে ফেলুন।
এলিয়া গ্রেডি

ম্যাক অক্স: rm -rf bar/; cp -r foo/ !$
মাইকেল ডিম্পিট

1
এটি সর্বদা কার্যকর নয় ... বা কাঙ্ক্ষিত ... কল্পনা করুন fooএবং barযদি বড় ডিরেক্টরি হয় ... সম্ভবত এমন ফাইল রয়েছে barযা fooআপনি সরাতে চান না। এটিকে বাস্তবসম্মত উত্তর হিসাবে বিবেচনা করা উচিত নয়
Ass:

যদিও আমার জন্য কাজ করেছে তবে সেরা সমাধান নয় যেহেতু এখানে foo- তে অন্তর্ভুক্ত ফাইল রয়েছে / তবে বারে নেই / যা এই কাজটি মুছে ফেলা হবে।
নিটভিট

46

আপনাকে নিশ্চিত করতে চান, bar/অভিন্ন পর্যন্ত প্রান্ত foo/ব্যবহার rsyncপরিবর্তে:

rsync -a --delete foo/ bar/

যদি কেবল কয়েকটি জিনিস পরিবর্তিত হয় তবে এটি পুরো ডিরেক্টরিটি সরিয়ে ফেলা এবং পুনরায় অনুলিপি করার চেয়ে অনেক দ্রুত কার্যকর করবে।

  • -aহ'ল 'সংরক্ষণাগার মোড', যা এতে বিশ্বস্ততার সাথে ফাইলগুলি অনুলিপি foo/করেbar/
  • --deleteঅতিরিক্ত ফাইলগুলি সেইসাথে foo/থেকে অপসারণ করে bar/, bar/একইরকম শেষ নিশ্চিত করে
  • এটি কী করছে তা যদি আপনি দেখতে চান তবে -vhভার্বোজ এবং মানব-পঠনযোগ্য যুক্ত করুন
  • নোট: পর স্ল্যাশ fooপ্রয়োজন বোধ করা হয়, অন্যথায় rsyncকপি হবে foo/থেকে bar/foo/মুছে যাওয়ার বদলে bar/নিজেই।
    • (Rsync মধ্যে ডিরেক্টরি পর স্ল্যাশ বিভ্রান্তিকর হয়; যদি তুমি আগ্রহী, এখানে খবর এর তারা rsync বলতে পড়ুন। বিষয়বস্তু বরং ডিরেক্টরির চেয়ে ডিরেক্টরি নিজেই তাই থেকে ওপর দিয়েই লিখতে। বিষয়বস্তু এর foo/বিষয়বস্তু সম্মুখের bar/, আমরা উভয় উপর একটি স্ল্যাশ ব্যবহার এটা বিভ্রান্তিকর কারণ এটা করবে কাজ না একটি স্ল্যাশ সঙ্গে আশানুরূপ। তন্ন তন্ন , যদিও; rsync sneakily সবসময় গন্তব্য পথ ব্যাখ্যা করে যেন এটি একটি স্ল্যাশ আছে, যদিও এটি উৎসের উপর স্ল্যাশ তার অনুপস্থিতি সম্মান পথ। এটা গন্তব্য পথে স্বয়ংক্রিয় যোগ স্ল্যাশ মেলে করতে, তাই আমরা উৎস পথে স্ল্যাশ প্রয়োজন আমরা কপি করতে চান তাহলে বিষয়বস্তু এর foo/মধ্যে bar/বরং ডিরেক্টরির চেয়েfoo/নিজেই মধ্যে অবতরণ bar/যেমন bar/foo।)

rsync খুব শক্তিশালী এবং দরকারী, যদি আপনি কৌতূহলী হন তবে এটি আর কী করতে পারে তার জন্য চারপাশে নজর দিন (যেমন এসএসএসের উপর অনুলিপি করা)।


1
cp -Tবিকল্পটির চেয়ে এই উত্তরটি পছন্দ করুন কারণ এটি ম্যাকক্সেক্স on
টিঙ্গুয়েরু

18

এই cpআদেশটি ব্যবহার করুন :

cp -Rf foo/* bar/

9
এটি বারে উপস্থিত ফাইলগুলিকে সরায় না তবে ফু-তে নেই।
আরা

5
আপনি কি বলতে চাইছেন তা জানেন না। কেন cpআদেশটি উত্স থেকে ফাইল সরানো উচিত ?
অনুভা

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

ওভাররাইট বলতে কী বোঝায় আমরা তাতে একমত নই, আমার জন্য এটি মূলত প্রতিস্থাপন করা হয়েছে, যখন আপনি মেগ্রে বলতে চেয়েছিলেন? ওপি ঠিক কী চায় তা বলা মুশকিল কারণ তিনি কেবল দুটি ফাইলই উল্লেখ করেছিলেন যা ফু ও বার উভয়ই রয়েছে।
আরা

এই সিনট্যাক্সটি লুকানো ডট ফাইলগুলিকেও উপেক্ষা করে। বিপুল সংখ্যক লোকও বিশ্বকে উড়িয়ে দিতে পারে।
xpusostomos

13

নিম্নলিখিত কমান্ডটি ডটফাইলগুলি (লুকানো ফাইল) অনুলিপিটিতে অন্তর্ভুক্ত করা নিশ্চিত করেছে:

$ cp -Rf foo/. bar

1
এটা কি সত্য? দেখতে অস্বাভাবিক মনে হচ্ছে।
ম্যাটং

2
@ ম্যাটং আমি কেবল এটি পরীক্ষা করেছি - হ্যাঁ এটি সত্য।
ম্যাটমার্বন

1
.ডিরেক্টরিতে থাকা সমস্ত ফাইল। সুতরাং, প্রাকৃতিকভাবে লুকানো ফাইলগুলি অন্তর্ভুক্ত করা হত।
জাসপ্রীত সিং

আসলে এটি বেশ ঝরঝরে। আপনি লিনাক্সে "cp -RTf foo বার" করতে পারেন।
xpusostomos

5

@ জোনাথন হুইলারের সাথে খুব মিল:

আপনি যদি মনে রাখতে না চান তবে পুনরায় লিখুন bar:

rm -r bar/
cp -r foo/ !$

!$ আপনার পূর্ববর্তী কমান্ডের শেষ যুক্তি প্রদর্শন করে।


4
$ সম্পর্কে টিপটি দুর্দান্ত!
লুকাস মরগান

0

এটা আপনার সমস্যা সমাধান করবে.

\cp -rf foo/* bar/

-1

আপনার সংজ্ঞায়িত অপারেশনটি "মার্জ" এবং আপনি এটি দিয়ে এটি করতে পারবেন না cp। তবে, আপনি যদি একত্রীকরণের জন্য এবং ফোল্ডারটি হারাতে চান না barতবে আপনি কেবল rm -rf barফোল্ডারটি মুছতে এবং তারপরে mv foo barপুনরায় নামকরণ করতে পারেন। উভয় অপারেশন ফাইল পয়েন্টারগুলি দ্বারা সম্পাদিত হয়, ফাইল সামগ্রী নয় not


-2

এই দুটি পদক্ষেপ কমান্ড সমন্বিত গঠিত ব্যবহার করার চেষ্টা করুন:

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