2009-06-05 16 views
30

Sto cercando di ottenere un elenco di tutti i file di registro (.log) nella directory, comprese tutte le sottodirectory.Come ottenere file in una directory, comprese tutte le sottodirectory

+1

Questo è già stato chiesto: http://stackoverflow.com/questions/837606/find-the-oldest-file-recursively-in- una-directory, così come alcune altre (cerca 'Python walk' nella casella di ricerca) –

risposta

-1

Se si desidera elencare nella directory corrente, è possibile usare qualcosa come:

import os 

for e in os.walk(os.getcwd()): 
    print e 

Basta cambiare il

os.getcwd() 

per altra strada per ottenere risultati lì.

+0

Questa risposta non affronta la domanda dell'OP e non è rilevante per la maggior parte delle persone che cercano la stessa risposta. – Andrew

59
import os 
import os.path 

for dirpath, dirnames, filenames in os.walk("."): 
    for filename in [f for f in filenames if f.endswith(".log")]: 
     print os.path.join(dirpath, filename) 
+1

Se si desidera cercare in una directory diversa da "." si potrebbe passare la direcotry come sys.argv [1] e chiamare os.walk (sys.argv [1]). –

+2

Miglioramento aggiuntivo: usa un generatore invece di una comprensione di lista: per nomefile in (f per f ...) –

+1

Se vuoi escludere una certa directory, ad es. 'Old_logs', puoi semplicemente rimuoverla da' dirnames' e non verrà cercato: 'se" old_logs "nei nomi: dirnames.remove (" old_logs ")' – CGFoX

6

È inoltre possibile utilizzare il modulo glob insieme a os.walk.

import os 
from glob import glob 

files = [] 
start_dir = os.getcwd() 
pattern = "*.log" 

for dir,_,_ in os.walk(start_dir): 
    files.extend(glob(os.path.join(dir,pattern))) 
+0

Cosa fanno i trattini bassi nel ciclo for? '_' –

+1

@nueverest 'os.walk' restituisce una tupla di 3' (dirpath, nomi di file, nomi di file) 'ad ogni iterazione, e ci interessa solo' dirpath' (assegnato a 'dir' sopra); i caratteri di sottolineatura sono usati solo come segnaposti per gli altri 2 valori che non ci interessano (ad esempio 'dirnames', e quindi' nomi di file', vengono assegnati alla variabile '_', che non useremo mai). – tavnab

0

ho una soluzione:

import os 
for logfile in os.popen('find . -type f -name *.log').read().split('\n')[0:-1]: 
     print logfile 

o

import subprocess 
(out, err) = subprocess.Popen(["find", ".", "-type", "f", "-name", "*.log"], stdout=subprocess.PIPE).communicate() 
for logfile in out.split('\n')[0:-1]: 
    print logfile 

Questi due prendono il vantaggio di find . -type f -name *.log.

Il primo è più semplice ma non garantiti per il bianco-spazio quando aggiungere -name *.log, ma ha funzionato bene per il semplice find ../testdata -type f (nel mio ambiente OS X).

Il secondo utilizzando il sottoprocesso sembra più complicato, ma questo è lo spazio bianco sicuro (di nuovo, nel mio ambiente OS X).

presenta un design ispirato da Chris Bunch, nella risposta https://stackoverflow.com/a/3503909/2834102

Problemi correlati