কয়েক হাজার ফাইল যুক্ত দক্ষতার সাথে দক্ষতার সাথে মুছুন


159

কয়েক হাজার ক্ষুদ্র ক্ষুদ্র ফাইলের সাথে আমাদের ফোল্ডার অযৌক্তিক হয়ে উঠার সমস্যা রয়েছে।

এমন অনেকগুলি ফাইল রয়েছে যা সম্পাদন করা rm -rfএকটি ত্রুটি প্রদান করে এবং এর পরিবর্তে আমাদের যা করা দরকার তা হ'ল:

find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;

এটি কাজ করে তবে খুব ধীর এবং স্মৃতিশক্তি হারিয়ে যাওয়া থেকে নিয়মিত ব্যর্থ হয়।

এই কাজ করতে একটি ভাল উপায় আছে কি? আদর্শভাবে আমি পুরো ডিরেক্টরিটি এর ভিতরে থাকা বিষয়বস্তুগুলির যত্ন না নিয়েই মুছে ফেলতে চাই।


16
rm -rf *ফোল্ডারে সম্ভবত অনেক যুক্তিযুক্ত কারণে ব্যর্থ হয়; তবে rm -rf folder/আপনি যদি পুরো ডিরেক্টরিটি যেভাবেই মুছে ফেলতে চান তবে কী হবে ?
sr_

4
এটি ম্যানুয়ালি মুছে ফেলার পরিবর্তে, আমি পৃথক পার্টিশনে ফোল্ডারটি রাখার পরামর্শ দিই এবং কেবল & আনম্যাট এবং বিন্যাস এবং & পুনঃনির্মাণটি আনমাউন্ট করুন।
বিবাজা 42

7
কৌতুহলের মাত্র বাইরে - কতগুলি ফাইল ভাঙতে লাগে rm -rf?
jw013

7
আপনার সম্ভবত প্রশ্নটির আরও সঠিক কিছু নামকরণ করা উচিত, যেমন "হাজার হাজার ফাইলযুক্ত বৃহত ডিরেক্টরিটি দক্ষতার সাথে মুছুন।" ডিরেক্টরি এবং এর বিষয়বস্তু মুছতে , সংজ্ঞা অনুসারে পুনরাবৃত্তি করা প্রয়োজন। আপনি নিজেই কেবল ডিরেক্টরি ইনডকে নিজেই লিঙ্কমুক্ত করতে পারেন (সম্ভবত মূল সুবিধার দরকার রয়েছে), ফাইল সিস্টেমটি আনমাউন্ট fsckকরতে এবং অব্যবহৃত ডিস্ক ব্লকগুলি পুনরায় দাবি করতে এটি চালাতে পারেন, তবে এই পদ্ধতিটি ঝুঁকিপূর্ণ বলে মনে হচ্ছে এবং এর চেয়ে দ্রুত আর নাও হতে পারে। তদতিরিক্ত, ফাইল সিস্টেম চেকটি যেকোনোভাবেই পুনরাবৃত্তভাবে ফাইল সিস্টেম ট্রিটিকে অনুসরণ করতে পারে।
jw013

4
একবার যখন আমার কাছে একটি ccacheফাইল ট্রি এত বিশাল হয়ে গিয়েছিল এবং rmএত দীর্ঘ সময় নিচ্ছিল (এবং পুরো সিস্টেমটি আস্তে আস্তে পরিণত করছে), অন্য সমস্ত ফাইল ফাইল সিস্টেম, ফর্ম্যাট থেকে অনুলিপি করা এবং সেগুলি অনুলিপি করা খুব দ্রুত ছিল was তার পর থেকে আমি এ জাতীয় বৃহত আকারের ছোট ছোট ছোট ছোট ছোট ছোট গাছকে তাদের নিজস্ব উত্সর্গীকৃত ফাইল সিস্টেমটি দিয়ে থাকি, যাতে আপনি mkfsসরাসরি পরিবর্তে এটি করতে পারেন rm
frostschutz

উত্তর:


211

Rsync ব্যবহার করা অবাক করা দ্রুত এবং সহজ।

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

@ সারথের উত্তরে আরও একটি দ্রুত পছন্দ উল্লেখ করা হয়েছে: পার্ল! এর মানদণ্ড এর চেয়ে দ্রুততর rsync -a --delete

cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'

সূত্র:

  1. https://stackoverflow.com/questions/1795370/unix-fast-remove-directory-for-cleaning-up-daily-builds
  2. http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

4
ধন্যবাদ, খুব দরকারী। আমি সারাক্ষণ আরএসসিএনসি ব্যবহার করি, আপনি এ জাতীয় মোছার জন্য এটি ব্যবহার করতে পারবেন এমন আমার কোনও ধারণা ছিল না। Rm -rf এর চেয়ে অনেক দ্রুত
জন পাওয়েল

22
rsyncসমতল থেকে দ্রুততর হতে পারে rm, কারণ এটি সঠিক ক্রমে মোছার গ্যারান্টি দেয়, সুতরাং কম বিট্রেস পুনঃনির্মাণের প্রয়োজন। এই উত্তরটি দেখুন সার্ভারফল্ট
328305/

7
যে কেউ যাও recursively একটি ভিতরে সব ডিরেক্টরি এবং ফাইল মুছে ফেলতে Perl অভিব্যক্তি পরিবর্তন করতে পারেন directory_to_be_deleted ?
অভিনব

5
দ্রষ্টব্য: যোগ -Pআরো কিছু প্রদর্শনের জন্য rsync করতে, এছাড়াও, বাক্য গঠন সম্পর্কে সতর্কতা অবলম্বন করা আবশ্যক বিকল্প, trailing স্ল্যাশ হয় বাধ্যতামূলক। পরিশেষে, আপনি শুকনো রান-n চালু করতে প্রথমে বিকল্পের সাহায্যে প্রথমবারে আরএসসিএন কমান্ড শুরু করতে পারেন ।
315

1
-aসমান -rlptgoD, তবে কেবল মুছে ফেলার -rdজন্য প্রয়োজনীয়
কোয়েন।

38

টুইটারে কেউ এর -deleteপরিবর্তে ব্যবহারের পরামর্শ দিয়েছেন-exec rm -f{} \;

এটি কমান্ডের দক্ষতা উন্নত করেছে, যদিও এটি সমস্ত কিছু সত্ত্বেও পুনরাবৃত্তি ব্যবহার করে।


11
এটি মানহীন। জিএনইউ findআছে -delete, এবং অন্য findসম্ভবত।
এনজোটিব

13
-delete-exec rmনিরাপত্তা এবং দক্ষতার কারণে যখন পাওয়া যায় তখন সর্বদা পছন্দ করা উচিত ।
jw013

6
জিএনইউ হ'ল ডি ফ্যাক্টো স্ট্যান্ডার্ড।
রনজাহান

17

যেমন কিছু সম্পর্কে: find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f

প্যারামিটারের জন্য যুক্তি পরিবর্তন করে আপনি একবারে মুছতে ফাইলের সংখ্যা সীমাবদ্ধ করতে পারেন -n। ফাঁকা ফাইলগুলির নামগুলিও অন্তর্ভুক্ত রয়েছে।


2
আপনার সম্ভবত সম্ভবত -n 20বিটের প্রয়োজন নেই , যেহেতু xargs এটিকে যাইহোক গ্রহণযোগ্য আর্গুমেন্ট-তালিকা আকারগুলিতে সীমাবদ্ধ করা উচিত।
অকেজো

হ্যাঁ তুমিই ঠিক. এখান থেকে একটি নোট man xargs: (...) max-chars characters per command line (...). The largest allowed value is system-dependent, and is calculated as the argument length limit for exec। সুতরাং -nবিকল্পটি এই জাতীয় ক্ষেত্রে যেখানে xargs সিএলআই বাফার আকার নির্ধারণ করতে পারে না বা যদি সম্পাদিত কমান্ডের কিছু সীমা থাকে।
ডিজিটাল_ইনফিনিটি

12

একটি চতুর কৌশল:

rsync -a --delete empty/ your_folder/

এটি সুপার সিপিইউ নিবিড়, তবে সত্যই দ্রুত। Https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html দেখুন


এটি এত দ্রুত নয়, কারণ এটি ডিরেক্টরি বিষয়বস্তু দক্ষতার সাথে পড়ে। 10x দ্রুত সমাধান এবং ব্যাখ্যার জন্য এই উত্তরটি দেখুন সার্ভারসফল্ট
/

2
@ মার্কি 555: প্রশ্নের সম্পাদনায় এটি rsync -a --delete43 সেকেন্ডের জন্য 60 সেকেন্ডের জন্য রিপোর্ট করা হয়েছে lsdent। অনুপাত 10x ছিল time ls -1 | wc -l বনাম time ./dentls bigfolder >out.txt(যে কারণ আংশিকভাবে ন্যায্য তুলনা হয় > fileবনাম wc -l)।
হাস্তুর

সমস্যা হল নেই কিছুই ওইখানে কম্যান্ডের আসলে DO মুছে ফেলার জন্য পছন্দসই ট্র্যাভেরসাল অপারেশন। কোড তারা দেয়? মার্কি 555 দ্বারা বর্ণিত হিসাবে কাজ করে না।
Svartalf

11

মন্তব্যের একটির প্রসারিত করে আমার মনে হয় না যে আপনি যা করছেন মনে করছেন আপনি তা করছেন।

আপনার পরিস্থিতি অনুকরণ করার জন্য প্রথমে আমি প্রচুর পরিমাণে ফাইল তৈরি করেছি:

$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done

তারপরে আমি ব্যর্থ হওয়ার কী প্রত্যাশা করেছি এবং আপনি প্রশ্নে কী করছেন তা দেখে মনে হচ্ছে:

$ rm -r foo/*
bash: /bin/rm: Argument list too long

কিন্তু এই করে কাজ:

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

6
এটিই একমাত্র সমাধান যা কাজ করেছিল: rm -Rf bigdirectoryবেশ কয়েকবার চালান । আমার কয়েক হাজার কোটি উপ-ডিরেক্টরি এবং ফাইল সহ একটি ডিরেক্টরি ছিল। আমি এমনকি চলবে না পারে lsবা findবা rsyncযে ডিরেক্টরির মধ্যে, কারণ এটি মেমোরির পরিমাণ স্বল্প। কমান্ডটি rm -Rfবহুবার ছেড়ে যায় (স্মৃতি ছাড়িয়ে) কেবল কোটি কোটি ফাইলের অংশ মুছে দেয়। কিন্তু অনেক চেষ্টা করার পরে অবশেষে এটি কাজটি করে। মনে হয় কেবলমাত্র সমাধানটি যদি স্মৃতিশক্তি থেকে দূরে থাকে তবে সমস্যা হয়।
এরিক 13

6

আমার -deleteতুলনায় পরীক্ষার সুযোগ ছিল -exec rm \{\} \;এবং আমার -deleteজন্য এই সমস্যার উত্তর ছিল।

-delete400,000 ফাইলের ফোল্ডারে থাকা ফাইলগুলি কমপক্ষে 1000 গুণ বেশি দ্রুত মুছে ফেলা ব্যবহার করে rm

'লিনাক্সে ফাইল সংখ্যক ফাইল কীভাবে মুছবেন' নিবন্ধটি পরামর্শ দেয় যে এটি প্রায় তিনবার দ্রুত, তবে আমার পরীক্ষায় পার্থক্যটি অনেক বেশি নাটকীয় ছিল।


3
ব্যবহার find -execকরে rmপৃথকভাবে প্রতিটি ফাইলের জন্য কমান্ড চালায় , এ কারণেই এটি এত ধীর।
মার্কি 555

5

-deleteউপরের বিকল্পটি সম্পর্কে : আমি একটি অস্থায়ী ফোল্ডারে একটি বৃহত সংখ্যক (1 এম + ইস্ট) ফাইলগুলি সরাতে এটি ব্যবহার করছি যা আমি তৈরি করেছি এবং অজান্তে রাতের বেলা পরিষ্কার করতে ভুলে গিয়েছি। আমি আমার ডিস্ক / পার্টিশনটি দুর্ঘটনাক্রমে পূরণ করেছি এবং find .কমান্ড ব্যতীত আর কিছুই তাদের মুছে ফেলতে পারে নি । এটি ধীর গতির, প্রথমে আমি ব্যবহার করছিলাম:

find . -ls -exec rm {} \;

তবে এটি একটি অতিমাত্রায় সময় নিচ্ছিল। এটি কিছু ফাইল মুছে ফেলার জন্য প্রায় 15 মিনিটের পরে শুরু হয়েছিল, তবে আমার ধারণা যে এটি শেষ পর্যন্ত শুরু হওয়ার পরে এটি প্রতি সেকেন্ডে 10 বা তারও কম সরিয়ে ফেলছিল। সুতরাং, আমি চেষ্টা করেছিলাম:

find . -delete

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

10:59:17 up 539 days, 21:21,  3 users,  load average: 22.98, 24.10, 22.87

এবং আমি লোড গড় ৩০.০০ ছাড়িয়ে যেতে দেখেছি যা একটি ব্যস্ত সিস্টেমের পক্ষে ভাল নয়, তবে আমাদের জন্য যা সাধারণত হালকাভাবে লোড হয় এটি কয়েক ঘন্টার জন্য ঠিক আছে। আমি সিস্টেমে বেশিরভাগ জিনিস পরীক্ষা করেছি এবং সেগুলি এখনও প্রতিক্রিয়াশীল তাই আমরা আপাতত ঠিক আছি।


যদি আপনি execপ্রায় ব্যবহার করতে চলেছেন তবে অবশ্যই ব্যবহার করতে চান না -lsএবং করা find . -type f -exec rm '{}' ++ আরও দ্রুত কারণ এটি একবারে হ্যান্ডেল করতে পারে এমন অনেক যুক্তি আরএমকে দেবে।
xenoterracide

আমি মনে করি আপনার এগিয়ে যাওয়া উচিত এবং এটির নিজের উত্তরে এটি সম্পাদনা করা উচিত ... কোনও মন্তব্যের জন্য এটি অনেক দীর্ঘ। এছাড়াও, এটির মতো শোনাচ্ছে যে আপনার ফাইল সিস্টেমে মোটামুটি ব্যয়বহুল মুছে ফেলা হয়েছে, উত্সাহী এটি কোনটি? আপনি এটি find … -deleteমাধ্যমে চালাতে পারেন niceবা ionice, এটি সাহায্য করতে পারে। সুতরাং কিছু ক্র্যাশ-নিরাপদ সেটিংসে কিছু মাউন্ট বিকল্প পরিবর্তন করতে পারে। (এবং, অবশ্যই, আর কী ফাইলসিস্টেম-এর উপর নির্ভর করে, সবকিছু মুছে ফেলতে দ্রুততম উপায়ে প্রায়ই হয় mkfs।)
derobert

3
লোড গড় সর্বদা সিপিইউ হয় না, এটি সময়ের সাথে সাথে ব্লক করা প্রক্রিয়ার সংখ্যা মাত্র একটি পরিমাপ। প্রক্রিয়াগুলি ডিস্ক I / O- এ ব্লক করতে পারে, যা সম্ভবত এখানে ঘটছে।
স্কোর_উন্ডারে

এছাড়াও নোট করুন যে লোড গড় লজিক্যাল সিপিইউগুলির সংখ্যার জন্য অ্যাকাউন্ট করে না। সুতরাং 1একক-কোর মেশিনের লোডাভ্যাগ 64৪ 64-কোর সিস্টেমে লোডভ্যাগের সমান - যার অর্থ প্রতিটি সিপিইউ সময় 100% ব্যস্ত is
মার্কি 555

3

লিনাক্সে প্রচুর সংখ্যক ফাইল মুছতে ব্যবহার করতে পারেন এমন কয়েকটি পদ্ধতি রয়েছে ,. আপনি ডিলিট অপশন সহ ফাইন্ড ব্যবহার করতে পারেন যা এক্সিকিউশন অপশনের চেয়ে দ্রুত। তারপরে আপনি পার্ল লিঙ্কটি ব্যবহার করতে পারেন, তারপরে এমনকি RSSync। লিনাক্সে ফাইলগুলি কীভাবে মুছে ফেলা যায়


3

বিটিআরএফস ভলিউম ব্যবহারের কথা বিবেচনা করুন এবং কেবলমাত্র বিপুল সংখ্যক ফাইলযুক্ত ডিরেক্টরিতে পুরো ভলিউম মুছুন।

বিকল্পভাবে আপনি কোনও এফএস চিত্র ফাইল তৈরি করতে পারেন এবং তারপরে সমস্ত ফাইলকে একবারে দ্রুত সরিয়ে ফেলতে আনমাউন্ট এবং এর ফাইলটি মুছতে পারেন।


2

ধরে parallelনিলাম জিএনইউ ইনস্টল করা আছে , আমি এটি ব্যবহার করেছি:

parallel rm -rf dir/{} ::: `ls -f dir/`

এবং এটি যথেষ্ট দ্রুত ছিল।


1

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

find <dir> -type f -exec ionice -c3 rm {} \;

5
এর +পরিবর্তে ব্যবহার \;করা এটি আরও দ্রুত তৈরি করবে কারণ এটি একবারে আরএম-তে আরও যুক্তি পাস করে, কম
কাঁটাচামচ করে

1
কেন নয় ionice -c3 find <dir> -type f -delete
jtgd

0
ls -1 | xargs rm -rf 

মূল ফোল্ডারের ভিতরে কাজ করা উচিত


1
lsফোল্ডারে ফাইলের পরিমাণের কারণে কাজ করবে না। findধন্যবাদ, যদিও আমাকে ব্যবহার করতে হয়েছিল thanks
টবি

4
@ টবি: চেষ্টা করুন ls -f, যা বাছাই অক্ষম করে। বাছাইয়ের জন্য সম্পূর্ণ ডিরেক্টরিটি বাছাই করার জন্য মেমরিটিতে লোড করা দরকার। একটি নিরবচ্ছিন্ন lsএর আউটপুট প্রবাহিত করতে সক্ষম হওয়া উচিত।
ক্যাম

1
নতুন লাইনে থাকা ফাইলের নামগুলিতে কাজ করে না।
ম্যাক্সচেলেপজিগ

@ ক্যামহ সত্য বাছাই করা ক্রমে ফাইলগুলি সরিয়ে ফেলা বাছাই করা থেকে দ্রুততর (কারণ প্রতিটি বিলোপের পরে ডিরেক্টরিটির বিটিরি পুনরায় গণনার জন্য)। উদাহরণের জন্য এই উত্তরটি দেখুন সার্ফারফলিট.এ
328305/105902

আপনি ব্যবহার করতে পারেন এমন ফাইলগুলির জন্য @ ম্যাক্সচলেপজিগ find . -print0 | xargs -0 rm, যা ফাইলের নাম পৃথককারী হিসাবে NULL চর ব্যবহার করবে।
মার্কি 555

0

উপরে ইজকাটার ইঙ্গিতটির জন্য:

কিন্তু এই করে কাজ:

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

এটি প্রায় কাজ করেছে - বা কাজ করবে - তবে অনুমতিতে আমার কিছু সমস্যা ছিল; ফাইলগুলি একটি সার্ভারে ছিল, কিন্তু এখনও আমি বুঝতে পারছি না যে এই অনুমতিটি সমস্যাটি এসেছে। যাইহোক, টার্মিনাল প্রতিটি ফাইলে কনফার্মেশন চেয়েছিল। ফাইলগুলির পরিমাণ প্রায় 20 000 ছিল, সুতরাং এটি কোনও বিকল্প ছিল না। " -R " এর পরে আমি "-f" বিকল্প যুক্ত করেছি, সুতরাং পুরো কমান্ডটি " rm -r -f ফোল্ডারনাম / " ছিল। তখন মনে হচ্ছিল ঠিকঠাক কাজ করছে। আমি টার্মিনালের সাথে একজন শিক্ষানবিশ, তবে আমার ধারণা এটি ঠিক আছে, তাই না? ধন্যবাদ!


0

এই ফাইলগুলি থেকে আপনার মুক্তি কতটা দরকার তা নির্ভর করে, আমি ব্যবহার করার পরামর্শ দিই shred

$ shred -zuv folder

আপনি যদি ডিরেক্টরিটি মুছে ফেলতে চান তবে আপনি এটিকে সরাতে ও পুনরায় তৈরি করতে পারবেন না, আমি আপনাকে এটিকে সরিয়ে এবং তাত্ক্ষণিকভাবে পুনরায় তৈরি করার পরামর্শ দিচ্ছি।

mv folder folder_del
mkdir folder
rm -rf folder_del

এটি দ্রুত, বিশ্বাস করুন বা না করুন, কারণ কেবল একটি ইনোড পরিবর্তন করতে হবে। মনে রাখবেন: আপনি কোনও মাল্টিকোর কম্পিউটারে এই স্বাদটিকে সত্যই সমান্তরাল করতে পারবেন না। এটি ডিস্ক অ্যাক্সেসে নেমে আসে, যা রেড দ্বারা সীমাবদ্ধ বা আপনার কাছে কী রয়েছে।


1
shred অনেক আধুনিক ফাইল সিস্টেমের সাথে কাজ করবে না

0

আপনার যদি কয়েক মিলিয়ন ফাইল থাকে এবং উপরের প্রতিটি সমাধান আপনার সিস্টেমে চাপে পড়ে আপনি এই অনুপ্রেরণার চেষ্টা করতে পারেন:

ফাইল nice_delete:

#!/bin/bash

MAX_LOAD=3
FILES=("$@")
BATCH=100

while [ ${#FILES[@]} -gt 0 ]; do
    DEL=("${FILES[@]:0:$BATCH}")
    ionice -c3 rm "${DEL[@]}"
    echo -n "#"
    FILES=("${FILES[@]:$BATCH}")
    while [[ $(cat /proc/loadavg | awk '{print int($1)}') -gt $MAX_LOAD ]]; do
        echo -n "."
        sleep 1
    done
done

এবং এখন ফাইলগুলি মুছুন:

find /path/to/folder -type f -exec ./nice_delete {} \+

সন্ধান getconf ARG_MAXকয়েক হাজার হাজার ফাইলের ব্যাচগুলি (দেখুন ) তৈরি করবে এবং এতে পাস করবে nice_delete। ওভারলোড সনাক্ত হওয়ার পরে এটি ঘুমানোর অনুমতি দেওয়ার জন্য আরও ছোট ব্যাচ তৈরি করবে।


0

যদি আপনি কেবলমাত্র অনেকগুলি ফাইল তাত্ক্ষণিকভাবে মুক্তি পেতে চান যত তাড়াতাড়ি সম্ভব ঠিকঠাক ls -f1 /path/to/folder/with/many/files/ | xargs rmকাজ করতে পারে তবে এটি প্রোডাকশন সিস্টেমে চালানো ভাল না কারণ আপনার সিস্টেমটি আইও ইস্যুতে পরিণত হতে পারে এবং ডিলিট অপারেশনের সময় অ্যাপ্লিকেশনগুলি আটকে যেতে পারে।

এই স্ক্রিপ্টটি অনেকগুলি ফাইলের জন্য দুর্দান্তভাবে কাজ করে এবং এটি সিস্টেমের আইলোডকে প্রভাবিত করবে না।

#!/bin/bash

# Path to folder with many files
FOLDER="/path/to/folder/with/many/files"

# Temporary file to store file names
FILE_FILENAMES="/tmp/filenames"

if [ -z "$FOLDER" ]; then
    echo "Prevented you from deleting everything! Correct your FOLDER variable!"
    exit 1
fi

while true; do
    FILES=$(ls -f1 $FOLDER | wc -l)
    if [ "$FILES" -gt 10000 ]; then
        printf "[%s] %s files found. going on with removing\n" "$(date)" "$FILES"
        # Create new list of files
        ls -f1 $FOLDER | head -n 5002 | tail -n 5000 > "$FILE_FILENAMES"

        if [ -s $FILE_FILENAMES ]; then
            while read FILE; do
                rm "$FOLDER/$FILE"
                sleep 0.005
            done < "$FILE_FILENAMES"
        fi
    else
        printf "[%s] script has finished, almost all files have been deleted" "$(date)"
        break
    fi
    sleep 5
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.