ডিরেক্টরিতে 1000 এলোমেলো ফাইলগুলি বাদ দিয়ে সমস্ত মুছুন


13

আমি একটি ডেটা জেনারেশন স্ক্রিপ্টটি খুব দীর্ঘ চালাতে দিয়েছি এখন আমার 200,000+ ফাইল রয়েছে যা আমার প্রায় 1000 এর মধ্যে কমিয়ে দেওয়া দরকার Linux ফাইল নাম বা অন্য কোনও বৈশিষ্ট্যের উপর কোনও নির্ভরতা থাকবে না?


যে প্রক্রিয়াটি ফাইল তৈরি করেছিল তাতে কি এমন বৈশিষ্ট্য ছিল যা প্রতিটি ফাইলের আগেরটির সাথে সম্পর্কিত ছিল? যদি তা হয় তবে এলোমেলোভাবে নির্বাচন করার চেয়ে প্রতিনিধির নমুনা পাওয়া গুরুত্বপূর্ণ হবে would তাহলে উত্পন্ন প্রক্রিয়া ফাইল প্রকৃতি দ্বারা র্যান্ডম হয়, আপনি করতে পারে মাত্র ডিলিট সবকিছু প্রথম 1000. পরে
fixer1234

উত্তর:


15

ডিরেক্টরিতে 1000 এলোমেলো ফাইলগুলি বাদ দিয়ে সমস্ত মুছুন

কোড:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm

ব্যাখ্যা:

  1. এর /path/to/dirসাথে সমস্ত ফাইল তালিকাভুক্ত করুন find;
    • print0: লাইন ডিলিমিটার হিসাবে ব্যবহার \0( নাল অক্ষর ); সুতরাং ফাঁকা স্থান / নিউলাইনযুক্ত ফাইলের পাথ স্ক্রিপ্টটি ভঙ্গ করে না
  2. এর সাথে ফাইল তালিকাটি সাফ করুন sort;
    • -z: (একটি নিউলাইন) এর \0পরিবর্তে ডিলিমিটার হিসাবে (নাল অক্ষর) ব্যবহার করুন\n
    • -R: বিক্ষিপ্ত আদেশ
  3. এলোমেলো তালিকা সহ প্রথম 1000 লাইনগুলি স্ট্রিপ করুন tail;
    • -z: তালিকাটিকে শূন্য-বিস্মৃত হিসাবে গণ্য করুন (এর সাথে একই sort)
    • -n +1001: 1001 থেকে শুরু হওয়া লাইনগুলি দেখান (যেমন প্রথম 1000 লাইন বাদ দিন)
  4. xargs -0 rm - বাকি ফাইলগুলি সরান;
    • -0: আবার শূন্য-বিস্মৃত

এটি কুইক্সোটিকের সমাধানের চেয়ে ভাল কেন *:

  1. স্পেস / নিউলাইনযুক্ত ফাইলের নামগুলি নিয়ে কাজ করে।
  2. কোনও ডিরেক্টরি তৈরি করার চেষ্টা করবেন না (যা ইতিমধ্যে বিটিডব্লিউ থাকতে পারে)
  3. কোনও ফাইল স্থানান্তরিত করে না, এমনকি 1000 "ভাগ্যবান ফাইলগুলি" তালিকাভুক্ত করার পরেও স্পর্শ করে না find
  4. findকোনও কারণে আউটপুটটি \n(নিউলাইন) দিয়ে শেষ না হলে কোনও ফাইল মিস করা এড়ানো যায় ।

* - কুইক্সোটিকের জন্য ক্রেডিট | sort -R | head -1000, আমাকে একটি সূচনা পয়েন্ট দিয়েছে।


CentOS 6 এ চলছে আমি অবৈধ অপারেটস সম্পর্কে ত্রুটি পেয়েছি। ভাগ্যক্রমে আমি ফাইলপথগুলিতে ফাঁকা জায়গাগুলির সাথে উদ্বিগ্ন নই সুতরাং সেই অপারেশনগুলি আমার জন্য কাজ করেছেfind . -type f | sort -R | tail -n +1001 | xargs rm
ব্র্যাড

@ ব্র্যাড আপনি ত্রুটি বার্তা এবং আপনার সংস্করণ সরবরাহ করতে পারেন find? আমি আমার উত্তরটি উন্নত করার চেষ্টা করব, সাথে কাজ করার জন্য কিছু ইনপুট দরকার।
rld।

3
tail: invalid option -- 'z'আমার কাছে লেজের সংস্করণটি 8.4
ব্র্যাড

কোনও ফাইল না থাকলে ত্রুটি এড়াতে xargs --no-run-if-খালি যুক্ত করব (উদাহরণ হিসাবে এটি দু'বার চালানোর পরে)
ফ্রেফ

1

একটি অস্থায়ী ডিরেক্টরি ব্যবহার করুন, তারপরে findআপনার সমস্ত ফাইল, সাথে তালিকাটি এলোমেলো করুন এবং তালিকার sortশীর্ষস্থানীয় 1000টিকে অস্থায়ী ডিরেক্টরিতে সরান। বাকীটি মুছুন, তারপরে অস্থায়ী ডিরেক্টরি থেকে ফাইলগুলি সরিয়ে দিন।

$ mkdir ../tmp-dir
$ find . -type f | sort -R | head -1000 | xargs -I "I" mv I ../tmp-dir/
$ rm ./*
$ mv ../tmp-dir/* .

যদি xargsলাইন দৈর্ঘ্য প্রায় অভিযোগ, সঙ্গে একটি ছোট নম্বরটি ব্যবহার headএবং প্রয়োজনীয় কমান্ড পুনরাবৃত্তি (অর্থাত, পরিবর্তন -1000করার -500প্রয়োজন এবং এটি দু 'বার চালান, বা পরিবর্তন -200এবং এটি চালানোর 5 বার।)

এটি ফাঁকা অন্তর্ভুক্ত ফাইলের নামগুলি পরিচালনা করতেও ব্যর্থ হবে; যেমন @ rld এর উত্তর শো, আপনি ব্যবহার করতে পারেন find'র -print0যুক্তি, -zআর্গুমেন্ট sortএবং head, এবং -0সঙ্গে xargsসঠিক ফাইলের নাম হ্যান্ডলিং নিশ্চিত করতে হবে।

অবশেষে, যদি tmp-dirইতিমধ্যে বিদ্যমান থাকে, আপনার এমন একটি ডিরেক্টরি নাম স্থাপন করা উচিত যা বিদ্যমান নেই।


তালিকাভুক্ত ফাইলের নামের findমধ্যে একটি স্থান অন্তর্ভুক্ত করা হলে এটি ব্যর্থ হবে ।
rld।

0

ম্যাক ব্যবহারকারীদের জন্য নিম্নলিখিত স্ক্রিপ্টটি করা উচিত।

find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm

trবাছাই এবং লেজ \nপরিবর্তে তালিকায় কাজ করতে দেয় \0


-2

ডিরেক্টরিটি আরএমআরফ করা সবচেয়ে সহজ হতে পারে, তারপরে খুব বেশি সময় চলবে না তা নিশ্চিত করে ডেটা জেনারেশন স্ক্রিপ্টটি আবার চালান।


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