আমি একটি ডেটা জেনারেশন স্ক্রিপ্টটি খুব দীর্ঘ চালাতে দিয়েছি এখন আমার 200,000+ ফাইল রয়েছে যা আমার প্রায় 1000 এর মধ্যে কমিয়ে দেওয়া দরকার Linux ফাইল নাম বা অন্য কোনও বৈশিষ্ট্যের উপর কোনও নির্ভরতা থাকবে না?
আমি একটি ডেটা জেনারেশন স্ক্রিপ্টটি খুব দীর্ঘ চালাতে দিয়েছি এখন আমার 200,000+ ফাইল রয়েছে যা আমার প্রায় 1000 এর মধ্যে কমিয়ে দেওয়া দরকার Linux ফাইল নাম বা অন্য কোনও বৈশিষ্ট্যের উপর কোনও নির্ভরতা থাকবে না?
উত্তর:
কোড:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
ব্যাখ্যা:
/path/to/dirসাথে সমস্ত ফাইল তালিকাভুক্ত করুন find;
print0: লাইন ডিলিমিটার হিসাবে ব্যবহার \0( নাল অক্ষর ); সুতরাং ফাঁকা স্থান / নিউলাইনযুক্ত ফাইলের পাথ স্ক্রিপ্টটি ভঙ্গ করে নাsort;
-z: (একটি নিউলাইন) এর \0পরিবর্তে ডিলিমিটার হিসাবে (নাল অক্ষর) ব্যবহার করুন\n-R: বিক্ষিপ্ত আদেশtail;
-z: তালিকাটিকে শূন্য-বিস্মৃত হিসাবে গণ্য করুন (এর সাথে একই sort)-n +1001: 1001 থেকে শুরু হওয়া লাইনগুলি দেখান (যেমন প্রথম 1000 লাইন বাদ দিন)xargs -0 rm - বাকি ফাইলগুলি সরান;
-0: আবার শূন্য-বিস্মৃতএটি কুইক্সোটিকের সমাধানের চেয়ে ভাল কেন *:
find।findকোনও কারণে আউটপুটটি \n(নিউলাইন) দিয়ে শেষ না হলে কোনও ফাইল মিস করা এড়ানো যায় ।* - কুইক্সোটিকের জন্য ক্রেডিট | sort -R | head -1000, আমাকে একটি সূচনা পয়েন্ট দিয়েছে।
find . -type f | sort -R | tail -n +1001 | xargs rm
find? আমি আমার উত্তরটি উন্নত করার চেষ্টা করব, সাথে কাজ করার জন্য কিছু ইনপুট দরকার।
tail: invalid option -- 'z'আমার কাছে লেজের সংস্করণটি 8.4
একটি অস্থায়ী ডিরেক্টরি ব্যবহার করুন, তারপরে 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মধ্যে একটি স্থান অন্তর্ভুক্ত করা হলে এটি ব্যর্থ হবে ।
ম্যাক ব্যবহারকারীদের জন্য নিম্নলিখিত স্ক্রিপ্টটি করা উচিত।
find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm
trবাছাই এবং লেজ \nপরিবর্তে তালিকায় কাজ করতে দেয় \0।
ডিরেক্টরিটি আরএমআরফ করা সবচেয়ে সহজ হতে পারে, তারপরে খুব বেশি সময় চলবে না তা নিশ্চিত করে ডেটা জেনারেশন স্ক্রিপ্টটি আবার চালান।