নতুন ফাইলগুলি বাদ দিয়ে সবকিছু মুছে ফেলা হচ্ছে


8

বলি আমার একটি ডিরেক্টরি আছে ḟoo/যা কোনওরকম ডিরেক্টরি কাঠামোর মধ্যে প্রচুর পরিমাণে ফাইল রয়েছে। আমার এগুলির কয়েকটি রাখা দরকার, তবে এটি সব কিছু নয়।

(বলি) 500 টি নতুন বাদে কী সেগুলি মুছে ফেলার কোনও উপায় আছে?

উত্তর:


11

আমি এই কাজটি নিয়মিত করি এবং আমি নিম্নলিখিতগুলির রূপগুলি ব্যবহার করি। এটি একটি সাধারণ পাইপলাইন যা বিভিন্ন সাধারণ সরঞ্জামগুলির সাথে সম্মিলিত হয়: সমস্ত ফাইল সন্ধান করুন, ফাইল সংশোধন করার সময়টি আগেভাগে সাজান, বাছাই করুন, ফাইল সংশোধনের সময়টি সরান, 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"'

আমি rm -fযদিও সাবধানে হবে ।
একটি সিভিএন

একটি যাদুমন্ত্র মত কাজ করে! এটি alias পাথ এবং $ গণনা প্যারাম সহ একটি উপনাম হিসাবে উপলব্ধ হওয়া উচিত। অনেক ধন্যবাদ!
ডালিবোর কার্লোভিć

4

পাইথন 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)

4

আমি "500 নতুন" সম্পর্কে জানি না, তবে এটির সাহায্যে আপনি এক্স মিনিট / দিনের চেয়ে পুরানো জিনিসগুলি মুছতে পারেন। ফাইলের জন্য উদাহরণ এবং 2 দিনের বেশি পুরানো:

find foo/ -mtime +2 -a -type f -exec rm -fv \{\} \;

এর সাথে প্রথম পরীক্ষা করুন:

find foo/ -mtime +2 -a -type f -exec ls -al \{\} \;

"\;" এর আগে ব্যাকস্ল্যাশ এবং স্পেসটি মনে রাখুন। আরও তথ্যের জন্য অনুসন্ধান ম্যান পৃষ্ঠা দেখুন।


"(বলুন) 500 নবীনতম" এখানে সারমর্ম, তাই আমি দেখতে পাচ্ছি না কীভাবে এটি আসল প্রশ্নের উত্তর দেয়।
পিটার জন আকলাম

দুঃখিত, আমার কাছে পরিষ্কার ছিল না।
AndreasM

3

আপনি যদি নতুন এক্স নম্বরের পরিবর্তে ফাইলগুলি x দিন / ঘন্টা পুরানো রেখে করতে পারেন তবে আপনি কেবল এটির সাহায্যে এটি করতে পারেন tmpwatch --ctime 7d


2

আমি মনে করি -mtimeএবং -newerএর অপশন findকমান্ডটি আপনার জন্য উপযোগী। আপনি man findআরও তথ্যের জন্য দেখতে পারেন ।


0

কেন এই সহজ কোড ব্যবহার করবেন না:

$ ls -t1 foo/| xargs -d '\n' rm --

1
এটি 500 অতি সাম্প্রতিক ফাইলগুলি বাদে কীভাবে সমস্ত ফাইল সরিয়ে ফেলবে? এবং কিভাবে এই হ্যান্ডেল উপ-ডিরেক্টরিগুলি পরিচালনা করে? আমি মনে করি আপনি মূল পোস্টিং ভুল বুঝতে পারে।
পিটার জন আকলাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.