এমভি চালিয়ে যাওয়ার সেরা অনুশীলন


13

আমি টার্মিনালটি একটি ড্রাইভ থেকে অন্য ড্রাইভে ফাইল অনুলিপি করতে ব্যবহার করেছি।

sudo mv -vi /location/to/drive1/ /location/to/drive2/

যাইহোক এটি হঠাৎ বন্ধ হয়ে গেছে, এটির মধ্যে কয়েক ঘন্টা সময় এবং কোনও ত্রুটি ছাড়াই ডিরেক্টরি তৈরি করার পরে।

এর সাথে আমার নিজের সমাধানটি প্রায়শই হ্যাশিং এবং তুলনার মিশ্রণ যা বেশিরভাগ সময় ব্যয়কারী ঝামেলা কারণ এখন কোন ইন্টারমিডিয়েট অনুলিপি থেকে পুনরুদ্ধার করতে হবে আসলে কোন ফাইলগুলি অনুপস্থিত রয়েছে (zsh এর জন্য খুব দীর্ঘ ওয়ান-লাইনার হিসাবে লেখা) নোট করুন এই স্ক্রিপ্টটি লিখিতভাবে ব্যাশে কাজ করবে না:

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

যদি নাম টার্গেট ডিরেক্টরি বা উত্স_ডাইরেক্টরি পথের অংশ হয় তবে এটি ত্রুটিযুক্ত moved এছাড়াও এটি শেষে ডিরেক্টরি উত্স হয় না।

বাধা এমভি থেকে কীভাবে পুনরুদ্ধার করা যায় তার একটি সর্বোত্তম অনুশীলন রয়েছে?


আমি অনুরূপ স্ক্রিপ্ট লিখেছি , যা cmpহ্যাশিংয়ের পরিবর্তে ব্যবহার করে। এটির নির্ভরতা রয়েছে এবং while readগিলস উল্লিখিত একই সমস্যাগুলি রয়েছে । এটি ধীর এবং ভার্জোজও। তবে এটি আরএসআইএনসি পদ্ধতির চেয়ে শীঘ্রই ডিস্ক-স্থানকে মুক্ত করে দেয় কারণ ফাইলগুলি (পুনরায়) চলমান অবস্থায় উত্স থেকে সরানো হয়েছে moved এটি সাহসীদের জন্য অনুপ্রেরণা হিসাবে কাজ করতে পারে।
জোয়েটউইলডে

3
rsync অফার @joeytwiddle --delete-during receiver deletes during the transferএবং অন্যান্য দরকারী বিকল্প: --delete --delete-before --delete-delay --delete-after --delete-excluded। সুতরাং, হ্যাঁ,
আরএসএনসিইচ হ'ল

আমি নিশ্চিত কিছু একটা ভুলে যাচ্ছি। কেন একই mvআদেশের পুনরাবৃত্তি করা হচ্ছে না ? *মূল উত্সটি যদি কোনও ডিরেক্টরি হয় তবে সম্ভবত উত্স পথে সংযুক্ত।
jpa 11

@ আইসাক না, আমি ভয় করি যে rsync --delete*একটি বিপর্যয় ঘটবে ! এটি destবর্তমানে এমন জিনিসগুলিকে সরিয়ে ফেলবে srcযা পূর্ববর্তী প্রয়াসে সাফল্যের সাথে সরানো সমস্ত ফাইল এখন মুছে ফেলা হবে! আপনি সম্ভবত চিন্তা ছিল এর rsync --remove-source-filesযা আমি সম্মত হবে একটি ভাল বিকল্প হতে। (আরও 1 , আরও 2 )
জোয়েটউইল

@joeytwiddle না, rsync --deleteহবে শুধুমাত্র অপসারণ অন্যান্য ফাইল উৎস অংশ নয়। [Man rsync] () * থেকে ডেস্ট ডায়ার্স থেকে বহিরাগত ফাইলগুলি মুছুন *। বহির্মুখী অর্থ কী তা বুঝুন : সিঙ্ক হচ্ছে না। এবং হ্যাঁ, rsync এছাড়াও পরে তারা সঠিকভাবে প্রেরিত হয়েছে সোর্স ফাইল সরানোর জন্য একটি উপায় প্রদান করে।
নোটঅনিক্সনাজি

উত্তর:


46

Rsync পুনরায় উদ্ভাবন করার চেষ্টা সম্পর্কে ভুলে যান, এবং rsync ব্যবহার করুন।

sudo rsync -av /location/to/drive1/ /location/to/drive2/

আপনি উত্সটিতে একটি অনুসরণযোগ্য স্ল্যাশ ব্যবহার করেছেন তা নিশ্চিত করুন, অন্যথায় এটি অনুলিপি করে /location/to/drive2/drive1

কমান্ডটি সফল হয়েছে কিনা ডাবল-চেক করুন, তারপরে রান করুন rm -rf /location/to/drive1/

উপরের কমান্ডটি যে কোনও পূর্বনির্ধারিত ফাইলকে ওভাররাইট করবে drive2। আপনি ফাইল ইতিমধ্যে অস্তিত্ব এড়িয়ে যেতে ব্যবহারকারী চটপট করতে চান drive2, সঙ্গে যেমন mv -i, এটি আরো জটিল, কারণ আপনি এখন যে ফাইল ইতিমধ্যে অনুলিপি করা হয়েছে এবং ফাইল আছে না পার্থক্য করতে হবে। --ignore-existingগন্তব্যে ইতিমধ্যে বিদ্যমান ফাইলগুলির বিষয়বস্তু নির্বিশেষে আপনি আরএসসিঙ্কের বিকল্পটি পাস করতে পারেন । নোট করুন যে mvফাইলটি তৈরির মাঝামাঝি যদি মূলটি বাধাগ্রস্ত হয়, তবে এই ফাইলটি তার অর্ধ-অনুলিপি অবস্থায় থাকবে (যেখানে একটি খালি rsync -aএটি সঠিকভাবে অনুলিপি করবে)।

আপনি যদি mv -iঅনুরোধ সহ সঠিক আচরণটির পুনরায় উত্পাদন করতে চান তবে এটি করা যেতে পারে তবে এটি আরও জটিল।

মনে রাখবেন যে আপনার ওয়ান-জায়ান্ট-লাইনারটি খুব ভঙ্গুর। যদি ব্যাকস্ল্যাশ বা নিউলাইনযুক্ত ফাইলের নাম থাকে তবে সেগুলি সঠিকভাবে অনুলিপি করা যাবে না বা এমনকি তারা আপনার স্ক্রিপ্টকে স্বেচ্ছাসেবী ফাইলগুলি সরিয়ে ফেলতে পারে। সুতরাং আপনি যদি নিশ্চিত হন না যে ব্যাকস্ল্যাশ বা নিউলাইনগুলি না রাখার জন্য আপনি ফাইলের নামগুলিতে বিশ্বাস করতে পারেন তবে প্রশ্নটিতে কোডটি ব্যবহার করবেন না

ভবিষ্যতের রেফারেন্সের জন্য, আমি কখনও mvবৃহত ক্রস-ড্রাইভ চলার জন্য কখনও ব্যবহার না করার পরামর্শ দিই , কারণ এটি ব্যহত হলে কী ঘটে তা নিয়ন্ত্রণ করা শক্ত। অনুলিপি করতে আরএসএনসি ব্যবহার করুন এবং তারপরে মূলটি সরিয়ে ফেলুন।


কী কী প্রতিশ্রুতি দেয় rsync যে এমভি করে না?
কি

4
ভাল, উদাহরণস্বরূপ rsyncআপনি যা করার চেষ্টা করছেন তা করেন, যখন mvতা করেন না। এছাড়াও: বিভিন্ন মেশিনের মধ্যে অনুলিপি করা; স্থানান্তর জন্য সংকোচনের; টাইমস্ট্যাম্প- বা হ্যাশ-ভিত্তিক সমতার ভিত্তিতে গন্তব্যে থাকা ফাইলগুলি এড়িয়ে যাওয়া; মালিকানা, অনুমতি, লিঙ্ক এবং বিশেষ ফাইলগুলি কনফিগারযোগ্য হ্যান্ডলিং; ইত্যাদি। linux.die.net/man/1/rsync
সিলি ফ্রিক

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

9
ভাল, যখন আমি একটি পার্টিশনের মধ্যে ফাইল বা ডিরেক্টরিগুলি স্থানান্তর করি তখন আমি সাধারণত mv(বা ফাইল পরিচালক) ব্যবহার করি কারণ এটি কেবল ফাইল / ডিরেক্টরিতে একটি রেফারেন্স স্থানান্তর করে moving আমার যদি সত্যিকারের ডেটা ট্রান্সফার করার দরকার হয় তবে নীচেরগুলির rsyncমধ্যে একটি সত্য হলে আমি ব্যবহার করি : 1) আমি এক নজরে সঠিক স্থানান্তর পরীক্ষা করতে পারি তার চেয়ে বেশি ফাইল সরিয়ে নিচ্ছি; 2) আমি অনুমান করি যে আমার ফাইলগুলি সিঙ্কে রাখা দরকার; 3) আমি আশা করি স্থানান্তরটি বাধাগ্রস্ত হতে পারে। আমার পয়েন্ট হল, ব্যবহারের ক্ষেত্রে আপনি প্রশ্ন উপস্থাপন করছি জন্য, rsyncকেবল ডান টুল, এবং mvবা cpহয় না।
সিলি ফ্রিক

7
আমি সর্বদা -v এবং rydry-run দিয়ে যে কোনও rsync কমান্ড চালানোর পরামর্শ দিচ্ছি এটি ঠিক কী করছে তা নিশ্চিত করতে to
ড্যারেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.