কীভাবে দুটি ডিরেক্টরি অনুলিপি করবেন?


111

লিনাক্সে এই কাঠামোর সাথে আমার দুটি ডিরেক্টরি চিত্র এবং চিত্র 2 রয়েছে:

/images/ad  
/images/fe  
/images/foo  

... এবং অন্যান্য 4000 ফোল্ডার

এবং অন্যটি হল:

/images2/ad  
/images2/fe  
/images2/foo

... এবং অন্যান্য 4000 ফোল্ডার

এই ফোল্ডারের প্রত্যেকটিতে চিত্র রয়েছে এবং ইমেজ এবং চিত্র 2 এর অধীন ডিরেক্টরিগুলির নামগুলি হুবহু একই, তবে তাদের সামগ্রী আলাদা। তারপরে আমি জানতে চাই যে আমি কীভাবে / ইমেজ 2 / বিজ্ঞাপনের চিত্রগুলি চিত্র / বিজ্ঞাপনে, / ইমেজ 2 / ফু এর চিত্রগুলিকে চিত্র / ফু এবং অন্যান্য 4000 ফোল্ডারের সাথে অনুলিপি করতে পারি ..


1
উভয় ডিরেক্টরিতে শেষ ফাইলগুলির নাম একই রয়েছে?
কেবল_আমি

নাহ ... উদাহরণস্বরূপ চিত্র / বিজ্ঞাপনে 1.jpg, 2.jpg এবং 3.jpg হয়। তবে চিত্র 2 / বিজ্ঞাপনে 4.jpg এবং
5.jpg হয়

4
@ আমিরআলিআকবাড়ি, আমি মনে করি না যে এটি একটি সদৃশ - অন্য প্রশ্নটি মূলত 'এমভি মিশে যায়?' (উত্তর: না) এই প্রশ্নটি 2 ডিরেক্টরি শ্রেণিবিন্যাসকে কীভাবে মার্জ করবেন সে সম্পর্কে।
ম্যাক্সচলেপজিগ

উত্তর:


172

এটি rsync এর কাজ । শেল লুপের সাহায্যে ম্যানুয়ালি এটি করার কোনও সুবিধা নেই যদি না আপনি ফাইলটি অনুলিপি না করে সরিয়ে নিতে চান।

rsync -a /path/to/source/ /path/to/destination

আপনার ক্ষেত্রে:

rsync -a /images2/ /images/

(চিরকুট স্ল্যাশ অন নোট images2, অন্যথায় এটি অনুলিপি হবে /images/images2।)

যদি একই নামের চিত্রগুলি উভয় ডিরেক্টরিতে উপস্থিত থাকে তবে উপরের কমান্ডটি ওভাররাইট /images/SOMEPATH/SOMEFILEহয়ে যাবে /images2/SOMEPATH/SOMEFILE। আপনি যদি কেবল পুরানো ফাইলগুলি প্রতিস্থাপন করতে চান তবে বিকল্পটি যুক্ত করুন -u। আপনি যদি সর্বদা সংস্করণটি রাখতে চান /imagesতবে বিকল্পটি যুক্ত করুন --ignore-existing

আপনি যদি /images2rsync দিয়ে ফাইলগুলি সরিয়ে নিতে চান তবে আপনি বিকল্পটি পাস করতে পারেন --remove-source-files। তারপরে rsync সমস্ত ফাইলগুলি অনুলিপি করে অনুলিপি করে, এবং প্রতিটি ফাইল হয়ে গেলে এটি সরিয়ে দেয়। উত্স এবং গন্তব্য ডিরেক্টরি যদি একই ফাইল সিস্টেমে থাকে তবে এটি সরানোর চেয়ে অনেক ধীর।


14
..এডিডিপি-আপনি যদি অগ্রগতি দেখতে চান ..
Meetai.com

1
আমি যোগ হবে এখানে একটি চতুর শেল লুপ ব্যবহার এমনকি যদি আপনি কোন লাভই যে কি তাদের-ইন সেক্ষেত্রে মাত্র ব্যবহার অনুলিপি তাদের পরিবর্তে স্থানান্তর করতে চান rsyncতাহলে, rm -r /images
ওয়াইল্ডকার্ড

1
আমিও যে বাতলান চাই প্রতিটি ডিরেক্টরির জন্য trailing স্ল্যাশ অন্তর্ভুক্ত করা গুরুত্বপূর্ণ । উদাহরণস্বরূপ, যদি আপনি কেবল দৌড়ে যান তবে rsync -a images images2এটি চিত্রগুলিকে মার্জ করার পরিবর্তে চিত্রগুলিতে অনুলিপি করবে।
কাইল চেলিস

1
@ s3cur3 ওহ 2 থেকে (অন্তর্নিহিত) 1. এটি অপ্রয়োজনীয়। ধন্যবাদ, আমি আমার উত্তর স্থির করেছি।
গিলস

1
@ ম্যাক্সকপলান নং রাইঙ্ক কোনও ইন্টারেক্টিভ সরঞ্জাম নয়।
গিলস

43

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

rsync

উত্স থেকে গন্তব্যস্থলে একদিকে সিঙ্ক্রোনাইজ করে rsync। অতএব নিম্নলিখিত বিবৃতি

rsync -avh --progress Source Destination

উত্স থেকে গন্তব্য পর্যন্ত সবকিছু সিঙ্ক করে । মার্জ করা ফোল্ডারটি গন্তব্যস্থলে থাকে

-এর অর্থ "সংরক্ষণাগার" এবং উত্স থেকে প্রায় সব কিছু সংরক্ষণ করে গন্তব্য পর্যন্ত পুনরুক্তি করে সমস্ত কিছু অনুলিপি করে।

-v আরও আউটপুট দেয় ("ভার্বোজ")।

-হ মানব পাঠযোগ্য read

- প্রোগ্রাম কত কাজ হয় তা দেখানোর জন্য।

আপনি যদি কেবলমাত্র চান আপডেট গন্তব্য ফোল্ডারের নতুন সঙ্গে উৎস ফোল্ডার থেকে ফাইল:

rsync -avhu --progress source destination

মিশ

অভিন্নতা উভয় দিক সিঙ্ক্রোনাইজ করে। অতএব নিম্নলিখিত বিবৃতি

unison Source Destination

উভয় ডিরেক্টরি উভয় দিকের সিঙ্ক করে এবং শেষ পর্যন্ত উত্সটি গন্তব্যের সমান। এটি উত্স থেকে নিয়ত এবং বিপরীতে দুইবার আরএসএনসি করার মতো।

আরও উন্নত ব্যবহারের জন্য ম্যান পেজ বা নিম্নলিখিত ওয়েবসাইটগুলি দেখুন:

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/

2
আমি উল্লেখ করতে চাই যে ফোল্ডারের সঠিক পথটি শেষের পিছনে থাকা স্ল্যাশের সাথে হওয়া উচিত rsync -avh --progress source/ destination/, অন্যথায় উত্স ফোল্ডারটি গন্তব্য ফোল্ডারে তৈরি করা হবে, অন্তত আমার ক্ষেত্রে এটি এর মতো ছিল।
ইলেক্ট্রয়েড

এটি আমার জন্য দুর্দান্ত কাজ করে (ফোল্ডারে পেছনের স্ল্যাশ সহ)। ধন্যবাদ!
লিওপোলোডো সান্জিক

5
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

images2একটি প্রসারিত গ্লোব (পার্সিংয়ের সমস্যাগুলি এড়াতে ls) ব্যবহারের সমস্ত সামগ্রীর উপর লুপ করুন তারপরে mvসেই আইটেমগুলির সামগ্রীর সাথে মেলানো প্রবেশের প্রবেশদ্বারটি images। গ্লোববেড পাথ থেকে basenameঅগ্রণী ফালা ব্যবহার করে Usesimages2


আপনার আদেশটি কী করে সে সম্পর্কে আরও বিশদ যুক্ত করুন যাতে এটি ভবিষ্যতের পাঠকদেরও উপকারী হয় :)
রমেশ

1

@ inulinux12, আপনি forকমান্ড লাইন থেকে নিম্নলিখিত এক লাইন লুপটি ব্যবহার করতে পারেন :

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

এই থেকে ফাইল সব সরানো হবে images2থেকে imagesতাদের নিজ নিজ ডিরেক্টরিগুলি থেকে। দ্রষ্টব্য: এটি ধরে নিয়েছে যে কোনও ফাইলের একই নাম নেই।

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

মৃত্যুদন্ড কার্যকর করার আগে:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

মৃত্যুদন্ড কার্যকর করার পরে:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5

3
এর আউটপুট বিশ্লেষণ করবেন না lsmywiki.wooledge.org/ পার্সিংএলস
এটান

@ ইটানরাইজনার এই পরামর্শের জন্য আপনাকে ধন্যবাদ; প্রশ্নটিতে দেওয়া তথ্য দেওয়া হলেও বেশ সংকীর্ণ পরিস্থিতি মনে হচ্ছে।
কেবল_আমি

2
@ সিম্প্লি_মি যদিও সত্য যে এটি সাধারণত ভাল থাকবে, আপনি সত্যিই চান না যে আপনি এমন কোনও মামলায় আঘাত করছেন যখন আপনি গণনা করছেন না। এটি সত্যই খারাপ সমস্যার কারণ হতে পারে । এটি প্রায়শই প্রায় উল্লেখ করা যায় না (যেমন এই ক্ষেত্রে) একটি সাধারণ গ্লোব দিয়ে প্রায় তুচ্ছভাবে প্রতিস্থাপনযোগ্য। আমার উত্তরটি এর উদাহরণ হিসাবে দেখুন।
এটান রেইজনার

@ সিম্প্লি_মি দৃশ্যে ফাঁকযুক্ত ফাইলের নাম অন্তর্ভুক্ত রয়েছে যা চিত্রগুলির জন্য বেশ সাধারণ for
গিলস

@ গিলস এবং @ ইটান রিজনার, ইনপুটটির জন্য আপনাকে ধন্যবাদ, আমি এটির প্রশংসা করি! স্ট্রিং প্রতিস্থাপন ব্যবহার করার জন্য আমার উত্তর আপডেট এবং পরীক্ষিত হয়েছে এবং এটি basenameএই বিশেষ পরিস্থিতিতে ব্যবহার করার চেয়ে দ্রুত হয়েছে ( এটির জন্য ডাকার দরকার নেই basename)। গঠনমূলক মন্তব্যের জন্য আবার ধন্যবাদ।
কেবল_আমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.