2011-11-10 11 views
5

So come elencare tutte le sottodirectory e i file in una struttura di directory. Ma sto cercando il modo di elencare tutti i file appena creati, i file modificati e (se possibile) cancellati in tutte le directory in un albero di directory a partire dalla directory root.Codice Python per trovare tutti i file appena creati, modificati ed eliminati in tutte le directory/sottodirectory a partire dalla directory/

+0

Si prega di specificare ciò che appena creato è per voi. Entro l'ultima ora? L'ultimo giorno? Da un anno? Se sai come costruire un albero di directory, perché non usi semplicemente 'os.lstat' per accedere alle proprietà del file? – hochl

+0

Entro l'ultima ora .... – nsh

+0

quindi utilizzare 'st = os.lstat (percorso file)' e il campo 'st.st_mtime' e verificare se la differenza rispetto all'ora corrente è inferiore a 1800 - il gioco è fatto. – hochl

risposta

11

Si potrebbe trovare tutti i file creati o modificati negli ultimi mezz'ora, cercando al "mtime" di ogni file:

import os 
import datetime as dt 

now = dt.datetime.now() 
ago = now-dt.timedelta(minutes=30) 

for root, dirs,files in os.walk('.'): 
    for fname in files: 
     path = os.path.join(root, fname) 
     st = os.stat(path)  
     mtime = dt.datetime.fromtimestamp(st.st_mtime) 
     if mtime > ago: 
      print('%s modified %s'%(path, mtime)) 

per generare un elenco di file cancellati, devi anche avere a avere un elenco di file 30 minuti fa.


Una più robusta alternativa è quella di utilizzare un sistema di controllo di revisione come git. Fare un commit di tutti i file nella directory è come fare uno snapshot. Quindi il comando

git status -s 

elencherebbe tutti i file che sono stati modificati dall'ultimo commit. Questo elencherà anche i file che sono stati cancellati.

+0

L'esecuzione del codice sopra riportato dà il seguente errore: Traceback (ultima chiamata ultima): File "tsck.py", riga 13, in? print ('{p} modificato {m}'. Format (p = path, m = mtime)) AttributeError: l'oggetto 'str' non ha attributo 'format' – nsh

+0

C'è così lento, possiamo trovare un altro modo, attivare il sistema per registrare i file appena creati e quindi analizzare i file di registro. o il modo migliore è quello di aggiungere un trigger per la nuova voce di registro. Aiuto! – pylover

+0

@nsh: 'str.format' è stato introdotto in Python2.6. Per la versione precedente, è possibile utilizzare la formattazione della stringa in stile '% s'. Modificherò il mio post per mostrare cosa intendo. – unutbu

0

Date un'occhiata a "uomo trova"

creare un file temporaneo per confrontare

esempio:

find/-type f -newerB tempFile

qualche parte dell'uomo trovare

-newerXY reference 
      Compares the timestamp of the current file with reference. The reference argument is normally the name of a file (and one 
      of its timestamps is used for the comparison) but it may also be a string describing an absolute time. X and Y are place‐ 
      holders for other letters, and these letters select which time belonging to how reference is used for the comparison. 

      a The access time of the file reference 
      B The birth time of the file reference 
      c The inode status change time of reference 
      m The modification time of the file reference 
      t reference is interpreted directly as a time 
1
from tempfile import mkstemp 
import shutil 
import os 
import datetime as dt 
import sys 


# gets the time frame we are going to look back and builds a placeholder list to passover the info from our mtime to slay 
now=dt.datetime.now() 
ago=now-dt.timedelta(minutes=480) 
passover=[] 

# the '.' is the directory we want to look in leave it to '.' if you want to search the directory the file currently resides in 
for root,dirs,files in os.walk('.'): 
    for fname in files: 
     path=os.path.join(root,fname) 
     st=os.stat(path) 
     mtime=dt.datetime.fromtimestamp(st.st_mtime) 
     if mtime>ago: 
      passover.append(path) 


def slay(file_path, pattern, subst): 
    #Create temp file 
    fh, abs_path = mkstemp() 
    with open(abs_path,'w') as new_file: 
     with open(file_path) as old_file: 
      for line in old_file: 
       new_file.write(line.replace(pattern, subst)) 
    old_file.close() 
    #Remove original file 
    os.remove(file_path) 
    #Move new file 
    try: 
     shutil.move(abs_path, file_path) 
    except WindowsError: 
     pass 

#we pass the passover list to the slay command in a for loop in order to do muiltple replaces in those files. 
for i in passover: 
    slay(i,"String1","String2") 
+0

L'ho creato per cercare in una directory e selezionare i file modificati nell'ultimo lasso di tempo e quindi sostituire il testo in quei file. Questo copione non era in agguato e dovevo metterlo insieme dalla risposta sopra, quindi ho pensato che qualcun altro potesse venire a cercarlo. – Powerboy2

+0

Modifica la tua risposta con queste informazioni. Inoltre, una risposta completa dovrebbe contenere alcune righe che descrivono ciò che fa. Si prega di leggere il seguente articolo: [Come scrivere una buona risposta?] (Http://stackoverflow.com/help/how-to-answer) – Mariano

Problemi correlati