বলি আমার একটি ডিরেক্টরি আছে ḟoo/
যা কোনওরকম ডিরেক্টরি কাঠামোর মধ্যে প্রচুর পরিমাণে ফাইল রয়েছে। আমার এগুলির কয়েকটি রাখা দরকার, তবে এটি সব কিছু নয়।
(বলি) 500 টি নতুন বাদে কী সেগুলি মুছে ফেলার কোনও উপায় আছে?
বলি আমার একটি ডিরেক্টরি আছে ḟoo/
যা কোনওরকম ডিরেক্টরি কাঠামোর মধ্যে প্রচুর পরিমাণে ফাইল রয়েছে। আমার এগুলির কয়েকটি রাখা দরকার, তবে এটি সব কিছু নয়।
(বলি) 500 টি নতুন বাদে কী সেগুলি মুছে ফেলার কোনও উপায় আছে?
উত্তর:
আমি এই কাজটি নিয়মিত করি এবং আমি নিম্নলিখিতগুলির রূপগুলি ব্যবহার করি। এটি একটি সাধারণ পাইপলাইন যা বিভিন্ন সাধারণ সরঞ্জামগুলির সাথে সম্মিলিত হয়: সমস্ত ফাইল সন্ধান করুন, ফাইল সংশোধন করার সময়টি আগেভাগে সাজান, বাছাই করুন, ফাইল সংশোধনের সময়টি সরান, 500 টি বাদে সমস্ত লাইন প্রদর্শন করুন এবং সেগুলি সরিয়ে দিন:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | tail -n +501 | \
while read file; do rm -f -- "$file"; done
কয়েকটি মন্তব্য:
আপনি যদি "বাশ" ব্যবহার করছেন তবে আপনার কেবল "রিড-ফাইল ফাইল" ব্যবহার করা উচিত নয়।
ফাইলগুলি অপসারণ করতে "পার্ল" ব্যবহার করা দ্রুত (এবং "রিড-আর ফাইল" ব্যবহার না করা পর্যন্ত ফাইল-নামগুলিতে "অদ্ভুত" অক্ষরগুলি হ্যান্ডলুপের চেয়ে বেশি ভালভাবে পরিচালনা করে):
... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
"লেজ" এর কিছু সংস্করণ "-n" বিকল্পটিকে সমর্থন করে না, তাই আপনাকে অবশ্যই "লেজ +501" ব্যবহার করতে হবে। 500 প্রথম লাইনগুলি এড়িয়ে যাওয়ার একটি পোর্টেবল উপায় হ'ল
... | perl -wnle 'print if $. > 500' | ...
আপনার ফাইলের নামগুলিতে নতুন লাইন থাকলে এটি কাজ করবে না।
এটি GNU অনুসন্ধান প্রয়োজন হয় না।
উপরের সংমিশ্রণটি আপনাকে দেয়:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
পাইথন 3 এ এটিই আমি করব which যা অন্যান্য ওএসগুলির জন্যও কাজ করা উচিত। এটি পরীক্ষা করার পরে, লাইনটি প্রকৃতপক্ষে ফাইলগুলি সরিয়ে দেয় এমন অসুবিধা নিশ্চিত করার বিষয়টি নিশ্চিত করুন।
import os,os.path
from collections import defaultdict
FILES_TO_KEEP = 500
ROOT_PATH = r'/tmp/'
tree = defaultdict(list)
# create a dictionary containing file names with their date as the key
for root, dirs, files in os.walk(ROOT_PATH):
for name in files:
fname = os.path.join(root,name)
fdate = os.path.getmtime( fname )
tree[fdate].append(fname)
# sort this dictionary by date
# locate where the newer files (that you want to keep) end
count = 0
inorder = sorted(tree.keys(),reverse=True)
for key in inorder:
count += len(tree[key])
if count >= FILES_TO_KEEP:
last_key = key
break
# now you know where the newer files end, older files begin within the dict
# act accordingly
for key in inorder:
if key < last_key:
for f in tree[key]:
print("remove ", f)
# uncomment this next line to actually remove files
#os.remove(f)
else:
for f in tree[key]:
print("keep ", f)
আমি "500 নতুন" সম্পর্কে জানি না, তবে এটির সাহায্যে আপনি এক্স মিনিট / দিনের চেয়ে পুরানো জিনিসগুলি মুছতে পারেন। ফাইলের জন্য উদাহরণ এবং 2 দিনের বেশি পুরানো:
find foo/ -mtime +2 -a -type f -exec rm -fv \{\} \;
এর সাথে প্রথম পরীক্ষা করুন:
find foo/ -mtime +2 -a -type f -exec ls -al \{\} \;
"\;" এর আগে ব্যাকস্ল্যাশ এবং স্পেসটি মনে রাখুন। আরও তথ্যের জন্য অনুসন্ধান ম্যান পৃষ্ঠা দেখুন।
কেন এই সহজ কোড ব্যবহার করবেন না:
$ ls -t1 foo/| xargs -d '\n' rm --
rm -f
যদিও সাবধানে হবে ।