N দিনের চেয়ে পুরানো ডিরেক্টরিগুলি মুছতে শেল স্ক্রিপ্ট


165

আমার নামে ডিরেক্টরি রয়েছে:

2012-12-12
2012-10-12
2012-08-08

ব্যাশ শেল স্ক্রিপ্ট দিয়ে 10 দিনেরও বেশি পুরানো ডিরেক্টরিগুলি কীভাবে আমি মুছব?


1
তাদের প্রকৃত সৃষ্টি / পরিবর্তন সময়ের সাথে তাদের কোনও সম্পর্ক রয়েছে? কারণ findতখন নামটির দিকে না
তাকিয়েই

তাদের
উপরও

4
"বয়স্কের চেয়ে বেশি" বলতে কী বোঝ? আপনি কি সেই ডিরেক্টরিটি তৈরির সময়, এর বিষয়বস্তুগুলি সর্বশেষ পরিবর্তন করার সময়, বা অন্য কোনও কিছুর কথা উল্লেখ করছেন? নীচে কিছু উত্তর সতর্কতা অবলম্বন করুন; ctimeইনোড পরিবর্তন সময়। ডিরেক্টরিতে ফাইল যুক্ত করা বা ডিরেক্টরি থেকে সরানো হলে এটি পরিবর্তিত হয়।
আজকের

উত্তর:


389

এটি আপনার জন্য এটি পুনরাবৃত্তভাবে করবে:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

ব্যাখ্যা:

  • findফাইল / ডিরেক্টরি / লিঙ্ক ইত্যাদি সন্ধানের জন্য ইউনিক্স কমান্ড
  • /path/to/base/dir: আপনার সন্ধান শুরু করার জন্য ডিরেক্টরি।
  • -type d: কেবল ডিরেক্টরিগুলি সন্ধান করুন
  • -ctime +10: পরিবর্তনের সময়টি 10 ​​দিনের চেয়ে পুরানোগুলির সাথে কেবল বিবেচনা করুন
  • -exec ... \;: পাওয়া প্রতিটি ফলাফলের জন্য, নিম্নলিখিত কমান্ডটি ভিতরে করুন ...
  • rm -rf {}: পুনরাবৃত্তিতে ডিরেক্টরি মুছে ফেলার জন্য জোর করে; {}অংশ কোথায় ফলাফলের পূর্ববর্তী অংশ থেকে বা প্রতিস্থাপিত পরার।

বিকল্পভাবে, ব্যবহার করুন:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

যা কিছুটা বেশি দক্ষ, কারণ এটি এর পরিমাণ:

rm -rf dir1 dir2 dir3 ...

উল্টোদিকে:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

-execপদ্ধতি হিসাবে ।


এর আধুনিক সংস্করণগুলির সাহায্যে find, আপনি এটির ;সাথে প্রতিস্থাপন করতে পারবেন +এবং এটি xargsপ্রতিটি এক্সিকিউটিভ সিস্টেম সিস্টেমে যতগুলি ফাইল ফিট করবে ততগুলি পাসিং আপনার জন্য কলটির সমতুল্য করবে:

find . -type d -ctime +10 -exec rm -rf {} +

12
-mtimeএটি আমার জন্য আরও ভাল ছিল কারণ এটি অনুমতি পরিবর্তনের পরিবর্তে সামগ্রী পরিবর্তনগুলি পরীক্ষা করে, অন্যথায় এটি নিখুঁত ছিল।
কুইকশিফ্টিন

7
আমি মনে করি এটি নিজেই বেসটি ডিয়ারটিও মুছে ফেলবে
বা গাল

3
@ অরগাল আপনি একেবারে সঠিক এই প্রতিরোধ করার জন্য, শুধু ব্যবহার করুন: find /path/to/base/dir/*
zloynemec

11
ডিরেক্টরিগুলির বিষয়বস্তু উপেক্ষা করতে আপনি -maxdepth 1 ব্যবহার করতে পারেন
স্যাম

7
মুছে ফেলার জন্য আপনার অনেক বেশি ফোল্ডার থাকলে আরও কার্যকর পদ্ধতির ব্যাকফায়ার করতে পারে: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১১২৮৯৫৫১/২ । একই কারণে, বেস ফোল্ডারটি মুছে ফেলা এড়ানোর জন্য এটি ব্যবহার করা ভাল -mindepth 1(বরং তার চেয়ে ভাল /path/to/folder/*)।
ওহাদ স্নাইডার

41

আপনি যদি /path/to/baseউদাহরণস্বরূপ সমস্ত সাব-ডাইরেক্টরিগুলি মুছতে চান

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

তবে আপনি রুটটি মুছতে চান না /path/to/base, আপনাকে যুক্ত করতে -mindepth 1এবং -maxdepth 1বিকল্পগুলি করতে হবে, যা কেবলমাত্র অধীনস্থ ডিরেক্টরিগুলিতে অ্যাক্সেস করবে/path/to/base

-mindepth 1/path/to/baseম্যাচগুলি থেকে মূলকে বাদ দেয় ।

-maxdepth 1হবে শুধুমাত্র অবিলম্বে অধীনে সাব মেলে /path/to/baseযেমন /path/to/base/dir1, /path/to/base/dir2এবং /path/to/base/dir3কিন্তু এটি একটি recursive পদ্ধতিতে এই তালিকা সাবডিরেক্টরি না। সুতরাং এই উদাহরণ উপ-ডিরেক্টরি তালিকাভুক্ত করা হবে না:

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

এবং তাই এগিয়ে।

সুতরাং, /path/to/base10 দিনের চেয়ে পুরানো সমস্ত সাব-ডিরেক্টরিগুলি মুছতে ;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

19

find-deleteঅপারেশন সমর্থন করে, তাই:

find /base/dir/* -ctime +10 -delete;

আমি মনে করি এমন একটি ক্যাপচার আছে যে ফাইলগুলি 10+ দিন বেশি পুরানো হওয়া দরকার। চেষ্টা করা হয়নি, কেউ মন্তব্য করে নিশ্চিত করতে পারেন।

এখানে সর্বাধিক ভোট দেওয়া সমাধানটি অনুপস্থিত, -maxdepth 0সুতরাং এটি rm -rfমুছে ফেলার পরে এটি প্রতিটি উপ-ডিরেক্টরিকে কল করবে। এটি বোঝা যায় না, তাই আমি প্রস্তাব দিই:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

-deleteসমাধান উপরে ব্যবহার করে না -maxdepth 0কারণ findনালিশ জানাব Dir খালি না থাকে। পরিবর্তে, এটি বোঝায় -depthএবং নীচে থেকে মুছে ফেলা হয়।


আমি -deleteকাজগুলি নিশ্চিত করতে পারি , তবে আপনি যেমন বলেছিলেন আপনি কেবল এটি খালি ডিরেক্টরি মুছতে ব্যবহার করতে পারেন, অনেকটা পছন্দ rmdir
সিটিডিয়া

3

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

অবশেষে tmpreaper এ হোঁচট খেয়েছে এবং এটি আমাদের জন্য এখনও পর্যন্ত বেশ ভালভাবে কাজ করা হয়েছে।

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

মূল উত্স লিঙ্ক

পরীক্ষার মতো বৈশিষ্ট্য রয়েছে যা ডিরেক্টরিগুলি পুনরাবৃত্তভাবে পরীক্ষা করে এবং সেগুলি তালিকাভুক্ত করে। মুছে ফেলার সময় নির্দিষ্ট প্যাটার্নের জন্য সিমলিংক, ফাইল বা ডিরেক্টরি এবং সুরক্ষা মোড মুছানোর ক্ষমতা


2

অথবা

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

আপডেট হয়েছে, এর দ্রুত সংস্করণ:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
এটি সহজেই সর্বাধিক কমান্ডলাইন দৈর্ঘ্য অতিক্রম করতে পারে। দেখুন xargs --show-limits
মাইকেল Krupp

2
স্পেস বা অন্যান্য বিশেষ শেল অক্ষরযুক্ত ফাইলের নাম থাকলে তাও কাজ করবে না।
মার্টিন টর্নয়েজ

@ কার্পেটসমোকার -print0/ -0বিশেষ শেল অক্ষরগুলির যত্ন নেবে না , না?
এমপিএন

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