সাব-ডিরেক্টরি সহ x দিনের চেয়ে পুরানো ফাইলগুলি মুছতে স্ক্রিপ্টটি বাশ করুন


37

আমি x দিনের চেয়ে পুরনো এক টন ফাইল মুছতে চাইছি।

এখন এটি করার জন্য আমার কাছে একটি স্ক্রিপ্ট রয়েছে

find /path/to/files* -mtime +10 -exec rm {} \; 

তবে এটি উপ-ডিরেক্টরিগুলিও মুছে ফেলবে। এখানে একটি টন ফোল্ডার রয়েছে তবে আমি সেগুলি রাখতে চাই এবং উল্লিখিত ফোল্ডারগুলির মধ্যে 10 দিনেরও বেশি পুরানো ফাইলগুলি মুছতে চাই।

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


50

type ফিল্টারিং ফলাফলের জন্য বিকল্প

findtypeনির্বাচনের জন্য বিকল্প গ্রহণ করে , উদাহরণস্বরূপ, কেবলমাত্র ফাইল।

find /path/to/files -type f -mtime +10 -delete

-deleteএটি কী মুছে ফেলবে তা দেখাতে ছাড়ুন এবং একবার এটি যাচাই হয়ে গেলে এগিয়ে যান এবং পুরো কমান্ডটি চালান।

এটি কেবল ফাইলগুলিতে চলবে, ডিরেক্টরি নয়। -type dআপনার যুক্তিগুলির সাথে মেলে এমন বিপরীতমুখী, কেবলমাত্র ডিরেক্টরি ডিরেক্টরিগুলি ব্যবহার করুন ।


অতিরিক্ত অপশন

আপনি পড়তে চাইতে পারেন man find, কারণ ভবিষ্যতে আরও কয়েকটি বিকল্পের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, -maxdepthআপনাকে কেবলমাত্র পাওয়া আইটেমগুলিকে একটি নির্দিষ্ট গভীরতায় সীমাবদ্ধ করার অনুমতি দেয়, যেমন -maxdepth 0সাব-ডিরেক্টরিতে পুনরাবৃত্তি করবে না।

কিছু মন্তব্য

  • আমি অবাক হই যে কীভাবে কমান্ডটি কোনও ফোল্ডার সরিয়ে ফেলবে, আপনি rmকেবল একটি ফোল্ডার সরাতে পারবেন না বলে । আপনি প্রয়োজন চাই rm -rযে জন্য।

  • এছাড়াও, /path/to/files*বিভ্রান্তিকর। আপনার অর্থ কি /path/to/files/বা আপনি কি ওয়াইল্ডকার্ডটি বেশ কয়েকটি ফাইল এবং ফোল্ডারের নামগুলিতে প্রসারিত করার প্রত্যাশা করছেন?

  • {}একক উদ্ধৃতিতে রাখুন , অর্থাত্ '{}'শেল দ্বারা ব্যাখ্যাযোগ্য বিকল্প ফাইল / ডিরেক্টরি নামটি এড়াতে, যেমন আমরা একটি ব্যাকস্ল্যাশ দিয়ে সেমিকোলনকে রক্ষা করি।


ওয়েল / প্যাথ / টু / ফাইলের মধ্যে অনেকগুলি ফোল্ডার রয়েছে / আসলে আমি সেই প্রতিটি ফোল্ডারে এমটাইম +10-এক্সেক আরএম চালাতে চাইছি তবে ফোল্ডারগুলি নিজেই রাখতে চাই, মূলত আমি অর্জন করতে চাই এটি হ'ল সমস্ত মুছুন 10 দিনের চেয়ে পুরানো ফাইলগুলি এবং সমস্ত ফোল্ডার রাখুন। আমি সেই নবীনতার জন্য একজন নবীন দুঃখিত
জয়আইয়ান ইয়ে-হার্নান্দেজ

ঠিক আছে, আপনি সেখানে যান :) কেবল একটি করুন find /path/to/files* -type f -mtime +10এবং দেখুন এটির ফলাফল কি।
16

হ্যাঁ, সন্দেহ হলে -exec, এটি করবেন না , এটি প্রথমে কী খুঁজে পায় তা দেখুন।
রব

2
@ জয়আইয়ানআই-হার্নান্দেজ আপনি -deleteযুক্তিটিও ব্যবহার করতে পারেন find, যা সমস্ত ফাইল এবং ফোল্ডারগুলি মুছে দেয়, কেবলমাত্র খালি থাকলে। এটি বোঝাচ্ছে -depth, অর্থাৎ গভীরতা-প্রথম অনুসন্ধান।
ড্যানিয়েল বেক

1
@ ক্রেকার তারপরে আপনার -mindepth 1পিতামাতার ডিরেক্টরিটি বাদ দিতে আপনাকে যুক্ত করতে হবে।
স্ল্যাক করুন

5

পূর্ববর্তী উত্তরের মতো (উভয়ের জন্য +1) কৌশলটি হ'ল -type fপ্রাকটিকেট ব্যবহার করা ।

দ্রষ্টব্য, আপনার পরিবর্তে প্রিকেট -exec rm '{}'ব্যবহার করতে পারেন -delete। তবে তা করবেন না। সঙ্গে -exec rm '{}'আপনি (এবং উচিত) প্রথম কি করতে পারেন -exec echo rm '{}'তা যাচাই করতে এই যে আপনি সত্যিই কি চাও। এর পরে কমান্ডটি পুনরায় চালু করুন echo

ব্যবহার -deleteকরা দ্রুততর (কোনও অতিরিক্ত fork()এবং execve()প্রতিটি ফাইলের জন্য নয়) তবে এটি ঝুঁকিপূর্ণ কারণ -deleteএটি একটি শর্ত হিসাবেও কাজ করে, তাই:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

তবে যদি আপনি কেবল আর্গুমেন্ট পরিবর্তন করেন:

# delete ALL files
find . -type f -name '*.tmp' -delete

আপনার যদি কখনও দরকার হয় findএবং rmটন ফাইলের জন্য দ্রুত কাজ করতে হয় তবে find ... | xargs ... rmইউনিক্স প্রতিমাটি দেখুন।


4
আমি মনে করি আপনার শেষ দুটি উদাহরণ হুবহু এক, সম্ভবত এটি সংশোধন করতে চাই!

1

আপনি সহজেই এটি ফাইন্ড কমান্ড দিয়ে করতে পারেন

$ find -type f

ফলাফলগুলি টাইপ ফাইল হতে সীমাবদ্ধ করে


1

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

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

tmpreaper -t 5d ~/Downloads


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

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

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


0

'+'পরিবর্তে কমান্ড ব্যবহার দ্রুত\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

এটি rmপ্রতিবার কোনও ফাইল সন্ধানের পরিবর্তে একবারে চলবে ।
( rmআপনার যদি কমান্ড লাইনের দৈর্ঘ্যের সীমাবদ্ধতার কারণে যদি সত্যিই প্রচুর পরিমাণে ফাইল থাকে তবে এটি বেশিরভাগ সময় চালানো যেতে পারে -delete)


0

rm -f find /path/to/files -type file -mtime -5

এটি 5 দিনের মধ্যে সংশোধিত ফাইলগুলি মুছবে

rm -f find /path/to/files -type file -mtime +5

এটি 5 দিন আগে সংশোধিত ফাইলগুলি মুছবে

সন্ধানের আগে এবং পরে 5 ব্যবহার করুন।

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