2010-05-12 6 views
5

Ich versuche Python zu verwenden, um einen Baum von Dateien/Verzeichnissen zu kopieren.Python CopyTree mit negierten ignorieren Muster

ist es möglich, copytree zu verwenden, um alles zu kopieren, die in foo endet?

Es gibt eine ignore_patterns Muster-Funktion, kann ich geben ihm eine negierte regulären Ausdruck? Werden sie in Python unterstützt?

z.

copytree (src, dest, Falsch, ignore_pattern ('! *. Foo')) Wo? bedeutet nichts, was in foo endet. danke.

+0

'(. * \. Foo)' ist der richtige Ausdruck alle Wörter zu erhalten, die .foo haben. (?! ...) wie in der re-Modul-Dokumentation [1] zu sehen, kann verwendet werden, um Ausdrücke zu negieren, aber ich konnte es nicht funktionieren lassen ... 1- http://docs.python.org/library/ re.html – Diones

Antwort

7

shutil.copytree hat eine ignore keyword. ignore kann auf alle aufrufbaren gesetzt werden. Angesichts des besuchten Verzeichnisses und einer Liste seines Inhalts sollte die aufrufbare Datei eine Sequenz von Verzeichnissen und Dateinamen zurückgeben, die ignoriert werden sollen.

Zum Beispiel:

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

Ich wollte nur darauf hinweisen, dass [unutbus Antwort] (http://stackoverflow.com/a/2821871/1177225) verschachtelte Verzeichnisse nicht durchsuchen wird, wenn sie nicht auch in "foo" enden. Stattdessen möchten Sie wahrscheinlich nur die Ends mit der Überprüfung durchführen, wenn nicht os.path.isdir (Dateiname). – Josh

+0

Der 'os.path.isdir' sollte auf' os.path.join (adir, filename) '' –

4

Aufbauend auf unutbu Antwort. Im Folgenden wird eine Liste aller Dateien genommen, dann entfernt diejenigen, die von "ignore_patterns" übereinstimmen, und gibt dann als Liste der Dateien zurück ignoriert. Das heißt, es macht eine doppelte Verneinung, nur die gewünschten Dateien zu kopieren.

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

Erklärung Ihres Codes. –