2010-05-12 13 views
5

Estoy tratando de usar python para copiar un árbol de archivos/directorios.python copytree with negated ignorar patrón

¿es posible usar copytree para copiar todo lo que termine en foo?

Hay una función de patrones ignore_patterns, ¿puedo darle una expresión regular negada? ¿Son compatibles con Python?

por ejemplo.

copytree (src, dest, False, ignore_pattern ('! *. Foo')) Donde! significa NO cualquier cosa que termine en foo. gracias.

+0

'(. * \. Foo)' es la expresión de la derecha para obtener todas las palabras que tienen .foo. (?! ...) como se ve en la documentación del módulo re [1] se puede usar para anular expresiones, pero no pude hacerlo funcionar ... 1- http://docs.python.org/library/ re.html – Diones

Respuesta

7

shutil.copytree tiene ignore keyword. ignore se puede establecer en cualquier llamador. Dado el directorio que se está visitando y una lista de sus contenidos, el invocable debe devolver una secuencia de directorio y nombres de archivos para ignorar.

Por ejemplo:

import shutil 
def ignored_files(adir,filenames): 
    return [filename for filename in filenames if not filename.endswith('foo')] 

shutil.copytree(source, destination, ignore=ignored_files) 
+1

Solo quería señalar que [la respuesta de unutbu] (http://stackoverflow.com/a/2821871/1177225) no atravesará directorios anidados a menos que también terminen en "foo". En su lugar, es probable que desee realizar solo los endswith check si no es os.path.isdir (filename). – Josh

+0

el 'os.path.isdir' se debe invocar en' os.path.join (adir, filename) ' –

4

Sobre la base de la respuesta de unutbu. A continuación, se incluye una lista de todos los archivos, luego elimina los los que coinciden con "ignore_patterns", luego los devuelve como una lista de archivos ignorados. Es decir, hace una doble negación para copiar solo los archivos que desee.

import glob, os, shutil 

def copyonly(dirpath, contents): 
    return set(contents) - set(
     shutil.ignore_patterns('*.py', '*.el')(dirpath, contents), 
     ) 

shutil.copytree(
    src='.', 
    dst='temp/', 
    ignore=copyonly, 
    ) 
print glob.glob('temp/*') 
0
def documentation(format): 
    call(['make', format, '-C', DOC_SOURCE_DIR]) 

    if (os.path.exists(DOC_DIR)): 
     shutil.rmtree(DOC_DIR) 

    ignored = ['doctrees'] 
    shutil.copytree('{0}/build/'.format(DOC_SOURCE_DIR), DOC_DIR, ignore=shutil.ignore_patterns(*ignored)) 
+1

Agregue la explicación de su código. –

Cuestiones relacionadas