2 ডিরেক্টরি তুলনা এবং 3 য় ডিরেক্টরিতে কপিরাইট পার্থক্য


32

উবুন্টু 12.04 চালানো, আমি 2 ডিরেক্টরি তুলনা করতে চাই, ফোল্ডার 1 / এবং ফোল্ডার 2 / বলতে এবং ফোল্ডার 3 / এর চেয়ে আলাদা যে কোনও ফাইল অনুলিপি করতে চাই। এছাড়াও নেস্টেড ফাইল রয়েছে, সুতরাং মিলের সাব-ডিরেক্টরিগুলিও অনুলিপি করা উচিত

এমন কোন একক আদেশ আছে যা আমাকে সাহায্য করবে? আমি পরিবর্তিত ফাইলগুলির পুরো তালিকা চালাতে পারি:

rsync -rcnC --out-format="%f" folder1/ folder2/

তবে আরএসআইএনসি-র কাছে এই ফাইলগুলি আলাদা টার্গেট ডিরেক্টরিতে "রফতানি" করার ক্ষমতা আছে বলে মনে হয় না। আমি কি সিপি বা অন্য কোনও প্রোগ্রামে তালিকাটি পাইপ করতে পারি, যাতে ফাইলগুলি অনুলিপি করা হয়, যখন ডিরেক্টরিগুলিও তৈরি হয়? উদাহরণস্বরূপ, আমি চেষ্টা করেছি

rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/

তবে এটি ডিরেক্টরিগুলি সংরক্ষণও করতে পারে না, এটি কেবল ফোল্ডার 3 / এর ভিতরে সমস্ত ফাইল অনুলিপি করবে


আমি সম্ভবত কিছু সংমিশ্রণ ব্যবহার চাই diff -qrএবং awkতালিকা তৈরী করতে, তারপর rsync...
ewwhite

আমি কীভাবে তালিকার সাথে rsync ব্যবহার করব?
পেরিক্লিশ

আমি হয় একটি লুপ চালাতে বা rsync --include-from=FILEবিকল্পটি ব্যবহার করব ।
ew white

(অলস হবেন না ...) তবে নীচের আরএসসিএনসি সমাধানটি মার্জিত।
ew white

উত্তর:


38

--Compare-dest ব্যবহার করুন।

ম্যান পৃষ্ঠা থেকে:

--compare-dest = DIR - এই বিকল্পটি rsync কে গন্তব্য মেশিনে ডিআইআরকে অতিরিক্ত স্থানক্রম হিসাবে ট্রান্সফার করার বিরুদ্ধে গন্তব্য ফাইলগুলির তুলনা করতে নির্দেশ দেয় (যদি ফাইলগুলি গন্তব্য ডিরেক্টরিতে অনুপস্থিত থাকে)। যদি ডিআইআর-তে কোনও ফাইল পাওয়া যায় যা প্রেরকের ফাইলের অনুরূপ হয় তবে ফাইলটি গন্তব্য ডিরেক্টরিতে স্থানান্তরিত হবে না। এটি পূর্ববর্তী ব্যাকআপ থেকে পরিবর্তিত কেবল ফাইলগুলির একটি স্পার্স ব্যাকআপ তৈরি করতে দরকারী।

প্রথমে আপনার বাক্য গঠন -ড্রাই-রান দিয়ে পরীক্ষা করুন

rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/

তারপরে একবার আপনি আউটপুট নিয়ে সন্তুষ্ট হন:

rsync -aHxv --progress  --compare-dest=folder2/ folder1/ folder3/

এই লিঙ্কটি --compare- গন্তব্য সুযোগের একটি ভাল ব্যাখ্যা আছে।


1
এর জন্য ধন্যবাদ, আমি এই পরামিতিটির ম্যান পৃষ্ঠা ব্যাখ্যাটি বুঝতে পারি নি। আগ্রহীদের জন্য, আমি এটি দিয়েছিলামrsync -rcC --compare-dest=folder2/ folder1/ folder3/
পেরিক্লিস

ওএসএক্স ব্যবহারকারীদের জন্য দ্রুত নোট। আমি rsync version 3.1.1 protocol version 31বোঝে না আমার স্থানীয় এবং rsync উপর ~/জন্য পাথ --compare-destPARAM।
জেভেগেনি স্মিরনভ

4
আমার জন্য, --compare-destএকটি পরম পথ প্রয়োজন required
পালসুইম

লেখক বা ওপি এর বিকল্পগুলির সাথে আমার পক্ষে কাজ করে নি। অর্থাত্ fonts/Makefile.inফাইলটি আউটপুট দেয় যা উভয় folder2এবং folder1ডায়ারে একরকম ।
হাই-এঞ্জেল

3

এই ছোট স্ক্রিপ্টটি কাজ করা উচিত:

folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n"  $folder1 $folder2`
    do
        if [ -d "$folder1/$x" ]; then
            mkdir -p "$folder3/$x"
        else
            cp -frv $folder1/$x $folder3/$x
        fi
done

তবে আমি আরও মনে করি যে ডিফার-কেআরআরকে পার্সিং আউটপুট দেওয়া ভাল সমাধান হতে পারে কারণ এটি প্রতিটি ফাইলের জন্য আপনাকে নিয়মিতভাবে পথ এবং নাম দেয়।

সম্পাদনা

এটি একটি কমান্ড হবে, আপনার কমান্ডটি কিছুটা সংশোধিত হয়েছে। তবে এটি এর folder1অধীনে তৈরি করবে folder3। এবং এটি পুরো পাথ দিয়ে কাজ করে না তবে উপরের স্ক্রিপ্টটিও পুরো পাথ দিয়ে কাজ করে না।

rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/

আমি ব্যবহৃত \"মধ্যে rsyncএটি ফাইল ও ডিরেক্টরিগুলি ঐ খালি ধারণকারী সাথে কাজ করা। উবুন্টু 10.04 এ পরীক্ষিত। আশা করি এটা সাহায্য করবে.


এই জন্য ধন্যবাদ, আমি আশা ছিল যে একটি একক কমান্ড যদিও উপস্থিত হবে

2
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/

folder1কমান্ড জারির আগে আপনি যদি প্রথমে নামতে ইচ্ছুক হন তবে এটি আমি সবচেয়ে সহজ ফর্মটি নিয়ে আসতে পারি ।

এটি ধীর গতির বিকল্প, তবে আমি বিশ্বাস করি এটি আপনার প্রয়োজনীয়তা পূরণ করে এবং আপেক্ষিক ডিরেক্টরি নাম ব্যবহার করে এটি কার্যকর করা যেতে পারে:

rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/

আমি আপনার আসল rsyncকমান্ডটি একা রেখেছি , কারণ আপনি বলেছিলেন যে এটি আপনাকে সঠিক ফাইলের তালিকা দিচ্ছে (এবং আমার পরীক্ষার ফাইলগুলি অবশ্যই আপনার চেয়ে পৃথক, তাই আমি নিশ্চিত করে বলতে পারি না যে আমি ভুল হলে সঠিক ফাইলের তালিকা পাব list এর সাথে).

grepসেখানে আউটপুট থেকে ডিরেক্টরির নাম অপসারণ করা হয় rsync

এর আউটপুটটি grepঅন্যটি rsyncব্যবহার করে পাইপ করা হয় xargs। PARAM সালে folder1/./{}অতিরিক্ত ./দিয়ে শুরু আপেক্ষিক ডিরেক্টরি তৈরি করতে rsync বলতে ব্যবহৃত হয় ./{}, উপেক্ষা folder1/। অন্য কথায়, এটি তৈরি করা এড়ানো হয় folder3/folder1/

আমি কেবল এটি সেন্টোস .4.৪ এ পরীক্ষা করতে সক্ষম হয়েছি, তবে আফাইক এটি উবুন্টু ১২.০৪ তে একই কাজ করা উচিত।

সম্পাদনা: আমার স্মরণ করা উচিত যে স্মিথিয়ানদের উত্তর নিঃসন্দেহে আরও ভাল, তবে আমি আপনাকে আপনার আসল rsyncকমান্ড দিয়ে কৌশলটি প্রয়োগ করতে চাইছিলাম কারণ এটি আপনাকে কাঙ্ক্ষিত আউটপুট দিচ্ছিল।

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