লিনাক্স সংযুক্ত ফোল্ডার: আরএসএনসি?


13

আমার কাছে ফোল্ডারের দুটি কপি রয়েছে

src/
dest/

নিম্নলিখিতগুলি করে আমি তাদের মার্জ করতে চাই:

যদি কোনও ফাইল কেবল এতে থাকে তবে srcআমি এটিতে স্থানান্তরিত হতে চাইdest

যদি কোনও ফাইল কেবল এতে থাকে তবে destআমি চাই যে এটি কেবলমাত্র আইডিকেই উপেক্ষা করবে।

যদি কোনও ফাইল উভয়ের মধ্যে থাকে এবং অভিন্ন বিষয়বস্তু (IE একই আকার এবং তারিখ) থাকে তবে এখান থেকে মুছুনsrc

যদি কোনও ফাইল উভয় ক্ষেত্রে থাকে এবং অভিন্ন বিষয়বস্তু না থাকে তবে পিছনে রেখে দিন srcযাতে আমি ম্যানুয়ালি এগুলি মার্জ করতে পারি।

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

আমি কীভাবে এটি করতে হবে তা জানার চেষ্টা করেছি rsyncতবে এখন পর্যন্ত কোনও ফলস্বরূপ হয়নি।

উত্তর:


17

আমি কেবল সীমাবদ্ধ কার্যকারিতা পরীক্ষা করেছি, সুতরাং দয়া করে এই কমান্ডটি সতর্কতা অবলম্বন করুন (- ড্রাই-রান):

rsync -avPr --ignore-existing --remove-source-files src/ dest

অনুগ্রহ করে অনুগ্রহ করে দেখুন / যেমন এটি এসসিআর অনুলিপি করার পরিবর্তে এসআরসি-এ পুনরাবৃত্তি হবে, এটি আপনার বিদ্যমান পাথগুলি বজায় রাখতে হবে।

--Remove-উত্স-ফাইলের পতাকাঙ্কনের সাথে মিলিয়ে --ignore-বিদ্যমান পতাকা ব্যবহার করে আপনি কেবলমাত্র src থেকে যে ফাইলগুলি সিআরসি থেকে ডেস্কে সিঙ্ক হয় সেগুলি মুছে ফেলবেন, এটি এমন ফাইল যা কেবলমাত্র নিয়মে উপস্থিত ছিল না।

সিঙ্ক না হওয়া ফাইলগুলি মুছে ফেলার জন্য, এটি হ'ল যেগুলি ইতিমধ্যে ডেস্টে / এসসিআর / হিসাবে রয়েছে, আপনি ব্যবহার করতে পারেন:

for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done

অথবা

find src -type f -exec bash -c 'cmp -s "$0" "${0/#src/dest}" && rm "$0"' {} \;

যদি ফাইলের নামগুলিতে শ্বেতক্ষেত্র / নতুন লাইন /… থাকতে পারে বিশেষ চরিত্র সম্পর্কে গিলসের মন্তব্য সম্পর্কে, এটি অবশ্যই মনে রাখা উচিত এবং এর অনেকগুলি সমাধান রয়েছে, তবে সবচেয়ে সহজ হ'ল একটি -i থেকে আরএম পাস করা যা সমস্ত মুছে ফেলার আগে প্রম্পট করবে। প্রদত্ত যে src /, বা এর মূল পথটি সন্ধানের জন্য সরবরাহ করা হয়েছে তবে পুরোপুরি যোগ্য পাথের ফলে সমস্ত ফাইলের নামগুলি উদ্ধৃতি ছাড়াই পৃথক এবং rm উভয় আদেশ দ্বারা সঠিকভাবে পরিচালনা করা উচিত।


সংশোধন: সেই কমান্ডটি এসআরসি থেকে ফাইলগুলি সরিয়ে ফেলবে না যদি গন্তব্যটিতে ইতিমধ্যে একটি অনুলিপি উপস্থিত থাকে
টোক

হ্যাঁ :(। এই অংশটিই আমি খুঁজে বের করতে খুব কষ্ট পাচ্ছি
ডেভিড ওনিল

2
ভাল, সুসংবাদটি হ'ল আপনি এটিকে খুব ঝামেলা ছাড়াই স্বতন্ত্রভাবে সমাধান করতে পারেন: for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done(আপনি || echo $fileযদি এটি পছন্দ করেন তবে এটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করা যেতে পারে )
টোক

নিফ্টি: এটাই আমার দরকার ছিল। আপনার উত্তরে এটি সম্পাদনা করুন, এবং আমি এটি গ্রহণ করব!
ডেভিড ওনিল

@ টোক: আপনার কমান্ড ফাইলের নামগুলিতে চাপ দেবে যাতে বিশেষ অক্ষর রয়েছে (শ্বেত স্পেস \?*[, প্রাথমিক -)। আপনাকে করার প্রয়োজন পরিবর্তনশীল বদল প্রায় ডবল কোট ব্যবহার , পাস --, ফাইল নাম সামনে ইউটিলিটি ব্যবহার find … -exec …আউটপুট পার্স পরিবর্তে findrmমিশ্রণে একটি আদেশ সহ , এটি বিপর্যয়ের একটি রেসিপি।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

6

একত্রীকরণ হ'ল আপনি যে সরঞ্জামটি সন্ধান করছেন। আপনি যদি গুই পছন্দ করেন তবে একত্রীকরণ-জিটিকে চেষ্টা করুন। তবে আমি মনে করি না এটি অনুরূপ ফাইলগুলি মুছে ফেলবে: একত্রীকরণ উভয় ডিরেক্টরি অভিন্ন করার চেষ্টা করুন। তবুও এটি সহজেই চিহ্নিত করবে 1) কোন ফাইলগুলি অনুলিপি করতে হবে তা চিহ্নিত করুন; ২) যার ম্যানুয়াল মেশিন প্রয়োজন।


এটি ওপি যা যা চায় ঠিক তা করে না, তবে এটি ওপির চূড়ান্ত লক্ষ্যটি অর্জন করে বলে মনে হচ্ছে। +1
রায়ান সি। থম্পসন

+1 দুঃখের বিষয়, আমি যে সার্ভারটিতে এটি চালাচ্ছি তার সাথে একত্রীকরণ ইনস্টল করা নেই বা আমার এটি ইনস্টল করার অনুমতিও নেই। তবে এটি অন্য কারও কাছে ভাল উত্তর হতে পারে।
ডেভিড ওনিল

1
আপনি seas.upenn.edu/~bcpierce/unison//download/… থেকে নির্বাহযোগ্য একযোগে ডাউনলোড করতে পারেন । এটি আপনার হোম ডিরেক্টরিতে কোথাও ইনস্টল করুন, এটি কেবল একটি ফাইল।
JooMing

2

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

cd src
find . -exec sh -c '
    set -- "/path/to/dest/$0"
    if [ -d "$0" ]; then #  the source is a directory 
      if ! [ -e "$1" ]; then
        mv -- "$0" "$1"  # move whole directory in one go
      fi
    elif ! [ -e "$0" ]; then  # the source doesn't exist after all
      :  # might happen if a whole directory was moved
    elif ! [ -e "$1" ]; then  # the destination doesn't exist
      mv -- "$0" "$1"
    elif [ -f "$1" ] && cmp -s -- "$0" "$1"; then  # identical files
      rm -- "$0"
    fi
  ' {} \;

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

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