7
votes

Python CopyTree avec un motif ignoré annoré

J'essaie d'utiliser Python pour copier un arbre de fichiers / répertoires.

est-il possible d'utiliser Copytree pour copier tout ce qui se termine dans FOO?

Il y a une fonction Ignore_Patterns Motifs, puis-je lui donner une expression régulière annulée? Sont-ils soutenus dans Python?

EG.

COPYTREE (SRC, DEST, FAUX, IGNORE_PATTERN ('! *. FOO')) Où ! signifie pas tout ce qui se termine dans FOO. merci.


1 commentaires

'(. * \. FOO)' est la bonne expression pour obtenir tous les mots qui ont .foo. (?! ...) Comme on le voit dans la documentation de Module [1] peut être utilisé pour nier les expressions, mais je ne pouvais pas le faire fonctionner ... 1- docs.python.org/library/re.html


4 Réponses :


8
votes

shutl.copytree code> a un ignorer Code> Mot clé . Ignorer code> peut être défini sur n'importe quel appel. Compte tenu du répertoire visité et une liste de son contenu, l'appelable doit renvoyer une séquence de noms de répertoires et de noms de fichiers à ignorer.

Par exemple: P>

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)


2 commentaires

Je voulais juste signaler que La réponse de Unutbu ne traversera pas les annuaires imbriqués à moins qu'ils ne se terminent également par "FOO". Au lieu de cela, vous voudrez probablement effectuer uniquement la vérification de l'endwith si non os.par.isdir (nom de fichier).


Le os.path.isdir doit être appelé sur os.path.join (adir, nom de fichier)



5
votes

bâtiment sur la réponse de Unutbu. Ce qui suit prend une liste de tous les fichiers, puis supprime em> ceux correspondus par "ignore_patterns", puis renvoie cela comme une liste de fichiers à être ignorés em>. C'est-à-dire une double négation pour ne copier que les fichiers que vous souhaitez.

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 commentaires

0
votes
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))

0 commentaires

0
votes

Bâtiment au sommet de @unutbu et @ johntellsall , cette solution fonctionne également de manière récursive.

copytree(src, dest, False, inverse_ignore_patterns("*.foo"))
rm_empty_folders(dest)


0 commentaires