লিনাক্সের এক ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে লক্ষ লক্ষ চিত্র সরিয়ে নেওয়ার দ্রুততম উপায় কী?


14

আমার দশ মিলিয়ন চিত্র রয়েছে যা 30 গিগাবাইট ডিস্ক স্পেস নেয় যা একটি স্থানীয় ডিরেক্টরি থেকে অন্য স্থানীয় ডিরেক্টরিতে স্থানান্তরিত হওয়া প্রয়োজন।

এটি করার সবচেয়ে কার্যকরী উপায় কী হবে? ব্যবহার করছেন mv? ব্যবহার করছেন cp? ব্যবহার করছেন rsync? অন্যকিছু?

আমার এগুলি নেওয়া দরকার:

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg

এবং তাদের এখানে সরান:

/path/to/new/img/dir/

5
mvউত্স এবং টার্গেট ডিরেক্টরি উভয়ই যদি একই ফাইল সিস্টেমে থাকে তবে আপনি পারফরম্যান্সের ভিত্তিতে বীট করতে পারবেন বলে আমি মনে করি না ।
ফ্রিডরিক হামিদি

উত্তর:


26

rsync এটি একটি দুর্বল পছন্দ হবে কারণ এটি প্রচুর ক্লায়েন্ট / সার্ভারের পটভূমির কাজ করে যা স্থানীয় পাশাপাশি দূরবর্তী সিস্টেমগুলির জন্য অ্যাকাউন্ট করে।

mvসম্ভবত সেরা পছন্দ। যদি সম্ভব হয় তবে আপনার mv directory_old directory_newচেয়ে চেষ্টা করা উচিত mv directory_old/* directory_new/। এইভাবে, আপনি এক মিলিয়ন জিনিসের পরিবর্তে একটি জিনিস সরান।


6
ফাইলগুলির পরিবর্তে ডিরেক্টরিগুলি সরানোর পরামর্শের জন্য +1 করুন।
প্রাক্তন আম্ব্রিস

4
এছাড়াও, ওয়াইল্ডকার্ড সম্প্রসারণ সম্ভবত mvলক্ষাধিকের কথা বললে সমর্থিত সর্বাধিক যুক্তিগুলি ভেঙে দেয় ।

6
আরএসসিএনসি স্থানীয় স্টোরেজ মিডিয়াতে স্থানান্তরগুলি পরিচালনা করে। এটি - whole-file (ডেল্টা এক্সফার অ্যালগরিদমের বাস্তবায়ন সরিয়ে) এবং অন্যান্য জিনিসগুলিকে --compression বাধা দেয় যা স্থানীয় স্থানান্তরগুলিতে কোনও উদ্দেশ্য করে না fers ডিরেক্টরিগুলি যদি বিভিন্ন ফাইল সিস্টেমে থাকে তবে 'এমভি' কোনও প্রকারের কার্য সম্পাদন করবে না। যদি তারা একই ফাইল সিস্টেমে থাকে না, তবে কেবল 'এমভি' এই ডিরেক্টরিগুলির মতো ডিরেক্টরিগুলি বলেছিল।
উটাহ জারহেড

যদি অনেকগুলি চিত্র থাকে তবে একটি সাধারণ শেল ওয়াইল্ডকার্ড ব্যবহার করা সর্বাধিক কমান্ড লাইনে উপচে পড়বে।
রাউল সালিনাস-মন্টেইগুডো

1
ডিস্কগুলির মধ্যে সরানো এখনও সমস্ত ডেটা সরিয়ে ফেলবে। একই ডিস্কে, mvকেবল ইনোডের তথ্য আপডেট করে তাই এটি mv directory_old directory_newদ্রুত কাজ করেmv directory_old/* directory_new
আনশুল

14
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • এটি যুক্তি প্রসারণকে উপচে ফেলবে না।
  • আপনি চাইলে ফাইল এক্সটেনশন নির্দিষ্ট করতে পারেন। (-নাম ...)
  • find -print0এর সাথে xargs -0আপনাকে নামগুলিতে স্পেস ব্যবহার করতে দেয়।
  • xargs -rmvসরানোর মতো কিছু না থাকলে চলবে না। ( mvকোনও উত্স ফাইল না দিলে অভিযোগ করবে)।
  • সিনট্যাক্স mv -tআপনাকে প্রথমে গন্তব্য এবং তারপরে উত্স ফাইলগুলি নির্দিষ্ট করার অনুমতি দেয় xargs
  • পুরো ডিরেক্টরিটি স্থানান্তর করা অবশ্যই অনেক দ্রুত, কারণ এতে থাকা ফাইলের সংখ্যা নির্বিশেষে এটি অবিচ্ছিন্ন সময়ে সঞ্চালিত হয় তবে:
    • উত্স ডিরেক্টরিটি কিছু সময়ের জন্য অদৃশ্য হয়ে যাবে এবং এটি আপনাকে সমস্যা তৈরি করতে পারে;
    • যদি প্রক্রিয়াটি বর্তমান ডিরেক্টরিটিকে আউটপুট ডিরেক্টরি হিসাবে ব্যবহার করে (সর্বদা একটি অচলিত অবস্থান থেকে সম্পূর্ণ পথের উল্লেখ করে), আপনাকে এটি পুনরায় চালু করতে হবে। (যেমন আপনি লগ রোটেশন দিয়ে থাকেন )।

যাইহোক, আমি নিজেকে জিজ্ঞাসা করব আমাকে সত্যিই এত বড় পরিমাণে ফাইলগুলি একবারে সরিয়ে নিতে হবে কিনা। ব্যাচ প্রসেসিং ওভাররেটেড। আমি চেষ্টা করি যে প্রচুর পরিমাণে কাজ না জড়ানোর জন্য যদি আমি জিনিসগুলি উত্পন্ন হওয়ার মুহুর্তে প্রক্রিয়া করতে পারি।


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

7

যদি দুটি ডিরেক্টরি একই ফাইল সিস্টেমে থাকে, mvতবে ডিরেক্টরিটির বিষয়বস্তু না করে DIRECTORY এ ব্যবহার করুন।

যদি তারা দুটি পৃথক ফাইল সিস্টেমে থাকে তবে আরএসসিএনসি ব্যবহার করুন:

rsync -av /source/directory/ /destination

/উত্সটি অনুসরণ করার বিষয়টি লক্ষ্য করুন । এর অর্থ এটি ডিরেক্টরিটির কন্টেন্টগুলি অনুলিপি করবে এবং ডিরেক্টরিটি নিজেই নয়। আপনি যদি ছেড়ে যান তবে /এটি ফাইলগুলি অনুলিপি করবে তবে তারা নামের একটি ডিরেক্টরিতে বসে থাকবে /destination/directory। / এর সাথে ফাইলগুলি সবেমাত্র আসবে/destination

rsyncআপনি যদি এটিকে মূল হিসাবে চালনা করেন বা ফাইলগুলি আপনার মালিকানাধীন থাকে তবে ফাইলের মালিকানা বজায় রাখবে। এটি mtimeপ্রতিটি পৃথক ফাইলের রক্ষণাবেক্ষণ করবে ।


2
একটি হার্ড ড্রাইভ থেকে অন্য একটি হার্ড ড্রাইভে একটি বড় ফোল্ডার অনুলিপি করার জন্য, rsyncচারিদিকে চেনাশোনাগুলি চালিত বলে মনে হচ্ছে mv। বখশিশের জন্য ধন্যবাদ!
লিও-দ্য ম্যানিক

2
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

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


2
যদিও এটি প্রশ্নের উত্তর দিতে পারে, আপনি কেন এটি করেন তার কিছু ব্যাখ্যা দিতে পারলে এটি আরও ভাল উত্তর হবে।
ডেভিডপস্টিল

1
যদি তারা স্থানীয় মেশিনে থাকে তবে সম্ভাবনা কি তারা একই ফাইল সিস্টেমে থাকে। ব্যবহার করে tar c | tar xআপনি ও (ফাইল_কাউন্ট) এর পরিবর্তে ও (টোটাল_সাইজ) এর একটি মূল্য পান।
রাউল সালিনাস-মন্টেইগুডো

1

ডিরেক্টরি_ল্ড এবং ডিরেক্টরি_ই উভয় একই ফাইল সিস্টেমে থাকায় আপনি বিকল্প হিসাবে cp -lপরিবর্তে ব্যবহার করতে পারেন mvcp -lমূল ফাইলগুলিতে একটি হার্ড লিঙ্ক তৈরি করবে। আপনি যখন 'মুভ' দিয়ে কাজটি সম্পন্ন করেন এবং ফলাফলের সাথে আপনি সন্তুষ্ট হন তবে আপনি ডিরেক্টরি_ল্ড থেকে এই ফাইলগুলি সরাতে পারেন। গতির দিক থেকে এটি 'এমভি' এর মতো হবে যেমন আপনি প্রথম লিঙ্কগুলি তৈরি করেন এবং তারপরে আপনি আসলগুলি সরিয়ে ফেলুন। তবে এই পদ্ধতির আপনাকে প্রথম থেকেই শুরু করতে দেয় যদি এটি বোঝা যায়


0

এটি নির্ভর করে (টিএম)। যদি আপনার ফাইল সিস্টেমটি অনুলিপি-অনুলিপি হয়, তবে অনুলিপি ( cpবা rsyncউদাহরণস্বরূপ) একটি চলনের সাথে তুলনীয় হওয়া উচিত। তবে বেশিরভাগ সাধারণ ক্ষেত্রে, মুভ ( mv) সবচেয়ে দ্রুত হবে, যেহেতু এটি কোনও ডেটা কোথায় স্থাপন করা হয়েছে তা বর্ণনা করে এমন ডেটার টুকরোগুলির চারপাশে স্যুইচ করতে পারে (দ্রষ্টব্য: এটি অত্যধিক সরলীকৃত)।

সুতরাং, আপনার গড় লিনাক্স ইনস্টলেশনতে আমি যাব mv

সম্পাদনা: @ ফ্রেডেরিক হামিদির মন্তব্যে একটি ভাল বক্তব্য রয়েছে: এটি কেবলমাত্র বৈধ যদি তারা উভয় একই ফাইল সিস্টেম এবং ডিস্কে থাকে। অন্যথায় তথ্য যাইহোক কপি করা হবে।


0

কমপক্ষে 10kk ফাইল অনুলিপি করতে (কোনও ডিরেক্টরি নেই), সিপি অভিযোগ দিয়েছিলেন:

/ বিন / সিপি কার্যকর করতে অক্ষম: তর্ক তালিকা খুব দীর্ঘ long

সর্বোত্তম বিকল্পটি হ'ল রাইঙ্ক:

rsync উত্স লক্ষ্য

এবং এটি খুব দ্রুত সম্পন্ন হয়েছিল!


0

আপনার যদি ফাঁকা জায়গা থাকে তবে এগুলিকে একটি একা .tar ফাইলে সংরক্ষণাগারভুক্ত করুন (কোনও সংক্ষেপণ ছাড়াই দ্রুত হয় না) এবং তারপরে সেই ফাইলটি সরান এবং এটি সংরক্ষণাগারভুক্ত করুন।


0

গন্তব্যের প্রকৃতি এই কাজটি করার সবচেয়ে কার্যকরী উপায় নির্ধারণ করবে। আসুন অনুমান আপনি একটি স্থানীয় সিস্টেমে, আপনার PWDহয় /এখনি। এবং /aলক্ষ লক্ষ চিত্র রয়েছে contains আমাদের কাজ হ'ল /bসমস্ত উপ-ডিরেক্টরি কাঠামো বজায় রেখে সমস্ত চিত্রগুলিতে সরিয়ে নেওয়া । ধরে /aনেওয়া যাক এবং /bস্থানীয়ভাবে সংযুক্ত ডিস্কের জন্য দুটি পৃথক পার্টিশনের জন্য মাউন্ট পয়েন্ট রয়েছে। আমরা একটি টারপাইপ দিয়ে এই কাজটি করতে চাই। এই কিছু সময় নিতে পারে, তাই নিশ্চিত আপনি ব্যবহার করছেন করতে screen, tmux, অথবা আপনি একটি ব্যাকগ্রাউন্ড প্রক্রিয়া হিসেবে এই চালানো।

tar -C /a -cf . | tar -C /b -xf -

যে সব ফাইল ও ডিরেক্টরিগুলি কপি হবে /aথেকে /b, তাই এখন আপনি পরিষ্কার করতে হবে /aএকবার আপনি নিশ্চিত এটা ত্রুটি ছাড়া সম্পন্ন করেন।

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