কোনও ফোল্ডারে কিছু ফাইল সরানো পুরো ফোল্ডারটি সরানোর চেয়ে বেশি সময় নেয় কেন?


21

আমার উবুন্টু ক্লাউড সার্ভারে লক্ষ লক্ষ চিত্র রয়েছে। আমি যখন mvকমান্ড ব্যবহার করে 12 মিলিয়ন ইমেজ সমন্বিত একটি সম্পূর্ণ ফোল্ডারটি সরিয়ে ফেলি তখন এটি প্রায় তাত্ক্ষণিকভাবে ঘটে। যাইহোক, যখন আমি mvকেবল চিত্রগুলি (ফোল্ডারটি নয়) তখন কিছুটা সময় নেয়। ফোল্ডারগুলির সাথে যত দ্রুত সমস্ত চিত্র সরিয়ে নেওয়ার কোনও উপায় আছে?

এই কি ঘটছে তা হয়:

  1. src ফোল্ডারে 12 মিলিয়ন চিত্র রয়েছে এবং আমি এটি ব্যবহার করে ডিএসটি ফোল্ডারে স্থানান্তরিত করি

    $ mv  src ../dst
    

    সাথে সাথে ঘটে

  2. Src ফোল্ডারের অভ্যন্তরে আমি স্থানান্তরিত করতে এটি করি:

    find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/ {} +
    

    এটি কিছুটা সময় নেয়।

দ্বিতীয় প্রক্রিয়াটি দ্রুত করার কোনও উপায় আছে কি?


1
কোনও সমাধান নয় - তবে স্পষ্ট করে বলার জন্য: সিএমডি 2 অবশ্যই সিএমডি 1 হতে হবে কারণ এটি অনুসন্ধান ব্যবহার করছে এবং ফলাফলের জন্য পদক্ষেপটি কার্যকর করে। এটি প্রাক-অনুসন্ধান-প্রক্রিয়া ব্যতীত সরাসরি পদক্ষেপের মতো দ্রুত আর কখনও হতে পারে না।
দুফতে

সম্ভবত dstবিভাজনে রয়েছে অন্যদিকে ../../dstরয়েছে।
ফুক্লভি

যেমনটি লিখিত হয়েছে তেমন কোনও বৈধ অনুসন্ধানের অনুরোধের মতোও দেখায় না। এতে কোনও {}যুক্তির অভাব রয়েছে যেখানে ফাইলের নাম (গুলি) প্রসারিত হবে।
আর ..

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

1
এটি একটি বৈধ প্রার্থনা নয় find। প্রতি ফাইল প্রতি একবার find ... -exec mv -t ../../dst/ {} \;কল করবে mv; find ... -exec mv -t ../../dest {} +কল হিসাবে প্রতি কল হিসাবে যতগুলি ফাইল অনুলিপি করা সম্ভব হবে তত দ্রুত হবে, তবে ডাইডেক্সিক্স 86৮ by দ্বারা ব্যাখ্যা অনুযায়ী ডিরেক্টরিটি নিজেই চালিত করার চেয়ে তত দ্রুত নয় ।
চিপনার

উত্তর:


50

টিএল; ডিআর : না

অল্প পরিমাণে ফাইলের জন্য, আপনার প্রয়োজন হবে না find, এমনকি এই সরলীকৃত এবং ছোট ক্ষেত্রে এমনকি যদি আপনি ঠিক থাকেন

mv *.jpg ../../dst/

একবারে পুরো ডিরেক্টরিটি সরানোর চেয়ে আরও বেশি সময় লাগবে।


কেন? মূল বিষয়টি কী তা বুঝতে হবে mv

সংক্ষিপ্তভাবে বলতে গেলে, mvএকটি নম্বর (একটি ডিরেক্টরি বা একটি ফাইল চিহ্নিত করে) একটি ইনোড (ডিরেক্টরিটি অন্তর্ভুক্ত ডিরেক্টরি) থেকে অন্য একটিতে সরানো হয়, এবং এই সূচকগুলি ফাইল সিস্টেমের জার্নালে বা FAT- এ আপডেট করা হয় (যদি ফাইল সিস্টেম থাকে) এমনভাবে প্রয়োগ করা হয়)।

যদি উত্স এবং গন্তব্য একই ফাইল সিস্টেমে থাকে তবে তথ্যের কোনও আসল গতি নেই, এটি কেবল অবস্থানটি পরিবর্তন করে, যেখানে তারা সংযুক্ত থাকে।

সুতরাং, যখন আপনি mv এক ডিরেক্টরির, আপনি এই অপারেশন করছেন এক সময়

কিন্তু যখন আপনি স্থানান্তর 1 মিলিয়ন ফাইল, আপনি এই অপারেশন করছেন 1 মিলিয়ন বার

আপনাকে ব্যবহারিক উদাহরণ দেওয়ার জন্য, আপনার অনেক শাখাবিশিষ্ট একটি গাছ রয়েছে। বিশেষত, একটি নোড রয়েছে যার সাথে 1 মিলিয়ন শাখা যুক্ত রয়েছে।
এই শাখাগুলি কেটে ফেলার জন্য এবং অন্য কোথাও সরিয়ে নিতে, আপনি হয় সেগুলির প্রতিটিকেই কেটে ফেলতে পারেন, তাই আপনি 1 মিলিয়ন কাটগুলি তৈরি করেন, বা আপনি নোডের ঠিক আগে কেটে ফেলেন, এইভাবে কেবল একটি কাটা তৈরি করুন (এটি ফাইলগুলি সরানোর মধ্যে পার্থক্য এবং ডিরেক্টরি)।


4
আপনার অন্তর্ভুক্ত করা উচিত যে mvএকই ফাইল সিস্টেমে একটি কেবলমাত্র টিওসি এন্ট্রির পুনর্লিখন।
ভিডিওনাথ

আমি নিশ্চিত নই যে আপনি টিওসি দ্বারা কী বোঝাতে চেয়েছেন তা আমি বুঝতে পেরেছি। আমি যতটা দূরে জানি, এক্স ফাইল ফাইলগুলিতে কোনও টেবিল নেই, বা এনটিএফএস, বা বিটিআরএফস ইত্যাদি on FAT এর একটি সারণী রয়েছে (এটি থেকে এটি নাম নেয়) তবে উদাহরণস্বরূপ ext নামগুলি এবং ব্লকগুলি, এবং পিতা-মাতা এবং শিশু এবং ইনোডগুলিতে অন্যান্য তথ্য সংরক্ষণ করে। আপনি যদি আমাকে এমন কোনও রেফারেন্সের দিকে নির্দেশ করতে পারেন যেখানে এটি ব্যাখ্যা করা হয়েছে যেখানে এক্সট্রা এফএসের টিওসি রয়েছে এবং এর জন্য কী ব্যবহার করা হয় তবে আমি আনন্দের সাথে উত্তরটি পড়ব এবং আপডেট করব :)
dadexix86

10
উম। mv *.jpg12 মিলিয়ন ফাইলের জন্য ব্যর্থ হতে পারে যার জন্য তিনি অনুসন্ধানটি ব্যবহার করেন। বেশিরভাগ ইউনিক্স, লিনাক্স অন্তর্ভুক্ত আমি বিশ্বাস করি (যদি কেউ গত 5-10 বছরে এটি পরিবর্তন না করে) কমান্ড লাইনের সীমাবদ্ধ সর্বাধিক দৈর্ঘ্য থাকতে পারে। আমি মনে করি এটি দীর্ঘ সময়ের জন্য লিনাক্সের জন্য K৪ কে ছিল। একই সীমা পরিবেশের ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য, আমি নিশ্চিত।
Zan Lynx

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

1
অবশ্যই, পরিভাষা এখানে মূল বিষয় নয়। গুরুত্বপূর্ণ বিটটি আপনি যা বলেছেন ঠিক তা হ'ল: একটি ফাইল সিস্টেমের অভ্যন্তরে, একটি পদক্ষেপ কেবল মেটাডেটা স্পর্শ করা প্রয়োজন needs এক ফাইল সিস্টেমে অন্য সিস্টেমে কোনও শর্টকাট নেই এবং সমস্ত ফাইলগুলি তাদের বিষয়বস্তু সহ এক এক করে সরানো (পুনরায় তৈরি করা) দরকার। সেক্ষেত্রে এটি কোনও বিষয় নয় যে কোনও একটি পুরো ডিরেক্টরি বা কেবল ফাইলগুলি ভিতরে নিয়ে চলেছে, এটি প্রায় ধীর হতে চলেছে।
ইলক্কাচু

13

এটি এখনও ধীর থাকবে কারণ যেমনটি উল্লেখ করা হয়েছে যে ফাইল সিস্টেমটিকে প্রতিটি ফাইলের নামটিকে নতুন জায়গায় যুক্ত করতে হবে।

যাইহোক, আপনি এখন যা আছে তা থেকে এটি গতি বাড়িয়ে তুলতে পারেন।

আপনার ফাইন্ড কমান্ড প্রতিটি ফাইলের জন্য একবার এক্সিকিউট চালায়। সুতরাং এটি mv12 মিলিয়ন ফাইলের জন্য 12 মিলিয়ন বার কমান্ড চালু করে । এটি দুটি উপায়ে উন্নত করা যেতে পারে।

  • শেষ পর্যন্ত একটি প্লাস যুক্ত করুন:
    find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/ +
    এটি আপনার সংস্করণে সমর্থিত তা নিশ্চিত করতে ম্যান-পৃষ্ঠাটি দেখুন find। প্রভাবটি mvপ্রতিটি কমান্ড-লাইনে যথাযথ ফাইল-নেম সহ কমান্ডের একটি সিরিজ চালানো উচিত ।

  • findএবং xargsএকসাথে ব্যবহার করুন । NUL ব্যবহার করবে, শূন্য বাইট ওরফে ফাইলের নাম আলাদা করে রাখে। এই প্লাসটি কোনওরূপে ফাইলের নামের ফাঁকে ফাঁকে কোনও সমস্যার সমাধান করে । হুকুম থেকে ফাইলের নাম তালিকা পড়তে হবে কমান্ড চালানোর মাপসই করা হবে হিসাবে অনেক ফাইলের নাম হিসাবে কমান্ড।
    find -maxdepth 1 -name '*.jpg' -print0 | xargs -0 mv -t ../../dst/
    -print0xargs -0xargsxargsfindmv


7

আপনার বিভ্রান্তি ফাইল সিস্টেম বিমূর্তি থেকে আসে যা আপনাকে বিশ্বাস করে যে কোনও ফোল্ডারে গাছের মতো ফ্যাশনে ফাইল এবং অন্যান্য ফোল্ডার রয়েছে। এটি আসলে সত্য নয়: একটি ফাইল সিস্টেমের মধ্যে থাকা সমস্ত ফাইল এবং ডিরেক্টরিগুলি একই স্তরে অবস্থিত এবং প্রয়োগের উপর নির্ভর করে কোনও ধরণের সংখ্যার সাথে চিহ্নিত হয়। ডিরেক্টরিগুলি কেবলমাত্র বিশেষ ফাইল যা অন্যান্য ফাইলগুলির তালিকা ধারণ করে।

আপনি যখন কোনও ফাইল সিস্টেমের মধ্যে ফাইলগুলি "সরান" করেন, প্রকৃত ফাইলগুলি কোথাও যায় না। বরং পরিবর্তনের প্রতিফলনের জন্য ডিরেক্টরিগুলির মধ্যে তালিকা আপডেট করা হয়।

mv src ../dstডিরেক্টরি থেকে ডিরেক্টরিতে একটি তালিকা এন্ট্রি সরিয়ে .দেয় ../dst, তাই এটি দ্রুত।

find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/কয়েক মিলিয়ন এন্ট্রি সরানো হয়েছে, তাই এটি ধীর। আপনি mvপ্রতি ফাইল প্রতি একবার নয় একবার এবং একবার কল করলে সম্ভবত এটির গতি বাড়ানো mvহতে পারে এবং কমান্ড নিজেই এক ধাপে বেশ কয়েকটি ডিরেক্টরি প্রবেশিকা সরিয়ে নিতে অনুকূলিত হতে পারে তবে আপনি যখন কোনও একক ডিরেক্টরিকে সরিয়ে নিয়ে যান তত দ্রুত করার উপায় নেই ।


4

সরলিকৃত উত্তর

একটি ফাইল সরানো সম্পন্ন হয় 3 পদক্ষেপ:

  • গন্তব্য ফোল্ডারের ইনোড তালিকার সাথে ফাইলটিতে একটি লিঙ্ক যুক্ত করুন
  • সফলভাবে লিঙ্কটি যুক্ত হয়েছিল কিনা তা পরীক্ষা করে দেখুন
  • উপরের চেকটি যদি সফল হয় তবে উত্স ফোল্ডারের আইওনডগুলির তালিকা থেকে লিঙ্কটি সরিয়ে দিন।

এই প্রক্রিয়াটি কোনও ফাইল বা ফোল্ডারের ক্ষেত্রে সমান।
এবং স্পষ্টতই 1 ফাইলের জন্য এটি করা 100 টি ফাইলের চেয়ে 100 গতিযুক্ত।

man link অ্যাড ()
man unlinkহ'ল অপসারণ () হ'ল
mvউপরের এই দুটি কমান্ড ব্যবহার করে এবং ডেটা ক্ষতি রোধ করতে একটি চেক ইন যোগ করে।


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