2010-02-10 7 views
1

J'ai plusieurs répertoires et je veux que les répertoires de plus de 7 jours soient supprimés. J'ai du code déjà implémenté mais ça ne semble pas fonctionner. Quelqu'un peut-il voir où je vais mal?Supprimer Anciens répertoires en Python

def delete_sandbox(): 

    for directories in os.listdir(os.getcwd()): 

     if not os.path.isdir(directories) or not os.stat(directories).st_ctime < time.time()-(7*24*3600): 
      continue 
     os.chdir(directories) 
     drop_sandbox() 
     os.chdir(rootDir) 
     os.system("sudo rm -rf "+directories) 
     print 'Folders older than 7 days old dropped and removed' 

Merci pour toute aide

La baisse de dossiers, mais ne supprimez sandboxes pas. Je veux que le programme entre dans chacun de ces dossiers, dépose le bac à sable, retourne dans le répertoire racine et supprime tous les anciens répertoires. Quand je fais cela, les dossiers existent toujours.

Cette fonction a également fonctionné lorsque les répertoires étaient supprimés par la date de chaîne stockée dans le nom du dossier. Mais maintenant que j'essaie d'obtenir l'horodatage, il a cessé de fonctionner.

J'ai testé le 'rm -rf'+directories et il ne supprime pas les anciens dossiers. Lorsque je tente shutil.rmtree je reçois le message d'erreur:

Traceback (most recent call last): 
    File "yep.py", line 21, in <module> 
    delete_sandbox() 
    File "yep.py", line 18, in delete_sandbox 
    shutil.rmtree(directories) 
    File "/home/build/workspace/downloads/Python-2.6.4/Lib/shutil.py", line 208, in rmtree 
    onerror(os.listdir, path, sys.exc_info()) 
    File "/home/build/workspace/downloads/Python-2.6.4/Lib/shutil.py", line 206, in rmtree 
    names = os.listdir(path) 
OSError: [Errno 2] No such file or directory: 'Debug' 

est-il un autre moyen de supprimer ces dossiers? Je l'ai fonctionné, j'ai utilisé shutil.rmtree et tout semblait fonctionner. Merci pour toute aide. Le code est modifié:

def delete_sandbox(): 

    for directories in os.listdir(os.getcwd()): 

     if not os.path.isdir(directories) or not os.stat(directories).st_ctime < time.time()-(sbox_age): 
      continue 
     os.chdir(directories) 
     drop_sandbox() 
     os.chdir(rootDir) 
     shutil.rmtree(directories) 
     print 'Sandboxes older than 7 days old dropped and removed' 

delete_sandbox() 
+3

qu'est-ce que cela signifie * ne semble pas fonctionner *? obtenez-vous un message d'erreur? – SilentGhost

+0

Cela échouerait si un nom de répertoire contenait des espaces (à l'appel os.system) ou si le répertoire en cours lors de l'entrée n'était pas 'rootDir'. Avez-vous une erreur, et si oui, quoi et où? Ou comportement inattendu, et si oui quoi et où? Quelques «impressions» nous donneront plus d'informations (vous nous donnez actuellement environ 0 bits ;-). –

+0

Suggestion générale/avertissement, lors de l'appel au système, en particulier lorsque 'rm' est impliqué. Donnez à votre fonction une option d'exécution à vide True par défaut qui imprime les commandes système qu'elle exécuterait. – MattH

Répondre

9
import os 
import time 
import shutil 
numdays = 86400*7 
now = time.time() 
directory=os.path.join("/home","path") 
for r,d,f in os.walk(directory): 
    for dir in d: 
     timestamp = os.path.getmtime(os.path.join(r,dir)) 
     if now-numdays > timestamp: 
      try: 
        print "removing ",os.path.join(r,dir) 
        # shutil.rmtree(os.path.join(r,dir)) #uncomment to use 
      except Exception,e: 
        print e 
        pass 
      else: 
        print "some message for success" 
+0

+1 pour shutil. Préféré à os.system ("rm -rf") –

1

os.listdir retourne une liste de chaînes, qui sont des chemins relatifs. Lorsque vous chdir vers rootdir, en fonction de ce que rootDir est, ces chemins peuvent ne plus être valides.

1
  • Que fait drop_sandbox()? (La fonction que vous nous avez donnée est delete_sandbox()) Peut-être que vous vouliez dire que c'était une fonction récursive et que vous utilisiez le mauvais nom de fonction
  • rootDir est une variable globale? Peut-être que vous vouliez dire os.chdir("..")
  • Que contient rootDir? os.listdir donne des chemins relatifs. Si rootDir est la base de votre recherche, les répertoires que vous avez listés peuvent ne pas fonctionner. Pire: s'ils le font, vous pourriez supprimer quelque chose que vous voulez toujours.

De plus, le paquet shutil a une fonction rmtree vous voudrez peut-être examiner.

0

Alors que l'idée générale de la réponse acceptée est bonne, l'implémentation a quelques points qui ne le sont pas.

  1. Les noms de variables ne sont pas facturés par le caractère.Vous pouvez l'appeler comme

    class CompRM(object): 
        exception_list = [] 
        path = None 
        comparator = None 
        comparator_target = None 
        comparator_delete_condition = None 
    
        delete_directories = False 
        delete_files = False 
    
        def __init__(self, target_path, comparator, comparator_target='st_mtime', comparator_delete_condition='>', delete_directories=False, delete_files=False): 
         self.path = target_path 
         self.comparator = comparator 
         self.comparator_target = comparator_target 
         self.comparator_delete_condition = comparator_delete_condition 
    
         for directory_path, directory_names, file_names in os.walk(self.path): 
          if delete_directories is True: 
           self.walk_names(directory_path, directory_names) 
          if delete_files is True: 
           self.walk_names(directory_path, file_names) 
    
         if len(self.exception_list) > 0: 
          raise Exception({'message': 'Encountered exceptions while deleting.', 'debug': self.exception_list}) 
    
        def walk_names(self, directory_path, names): 
         for _name in names: 
          _path = os.path.join(directory_path, _name) 
          _stat = os.stat(_path) 
          _value = getattr(_stat, self.comparator_target) 
          if self.delete_condition_met(_value): 
           self.safe_remove(_path) 
    
        def delete_condition_met(self, value): 
         if self.comparator > value and self.comparator_delete_condition is '>': 
          return True 
         if self.comparator < value and self.comparator_delete_condition is '<': 
          return True 
         return False 
    
        def safe_remove(self, remove_path): 
         print 'remove', remove_path 
         shutil.rmtree(remove_path, onerror=self.register_exception) 
    
        def register_exception(self, function, path, exception_info): 
         self.exception_list.append({ 
          function: function, 
          path: path, 
          exception_info: exception_info, 
         }) 
    

    ceci::

  2. S'il vous plaît ne pas écraser les méthodes de python comme dir()

Depuis que je avais besoin d'un peu plus de fonctionnalités que je pris votre idée et construit ce

comprm = CompRM('/tmp', time.time() - 60*60*24*7, comparator_target='st_ctime', delete_files=True) 

Où comparator_target est le nom attribué dans os.stat() qui est pris pour comparaison.

Cordialement, Justus

+0

'exception_list = []' au niveau de la classe est un bug. Cette liste est partagée entre les instances. Les attributs mutables doivent toujours être définis dans '__init__' pour éviter cela (généralement, c'est une bonne idée de le faire pour tous les attributs que vous allez toujours définir/utiliser sur les instances et utiliser les attributs de niveau classe uniquement lorsque vous voulez vraiment y accéder) au niveau de la classe) – ThiefMaster

+0

De même, 'is' est incorrect pour la comparaison. Utilisez '==' pour cela - est la vérification des objets identiques et c'est une pure coïncidence et un détail d'implémentation qui fonctionne pour certaines chaînes courtes. – ThiefMaster

Questions connexes