带有否定忽略模式的python copytree

Chr*_*s H 5 python regex

我正在尝试使用python来复制文件/目录树.

是否可以使用copytree复制以foo结尾的所有内容?

有一个ignore_patterns模式函数,我可以给它一个否定的正则表达式吗?他们是否支持python?

例如.

copytree(src,dest,False,ignore_pattern('!*.foo'))在哪里!不是指以foo结尾的任何东西.谢谢.

unu*_*tbu 7

shutil.copytree有一个ignore关键字.ignore可以设置为任何可调用的.给定正在访问的目录及其内容列表,callable应返回一系列要忽略的目录和文件名.

例如:

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)
Run Code Online (Sandbox Code Playgroud)

  • 我只是想指出 [unutbu 的回答](http://stackoverflow.com/a/2821871/1177225) 不会遍历嵌套目录,除非它们也以“foo”结尾。相反,如果不是 os.path.isdir(filename),您可能只想执行endswith 检查。 (3认同)
  • 应该在 `os.path.join(adir, filename)` 上调用 `os.path.isdir` (2认同)

joh*_*all 5

基于 unutbu 的答案。以下获取所有文件的列表,然后删除与“ignore_patterns”匹配的文件,然后其作为要忽略的文件列表返回。也就是说,它会双重否定只复制您想要的文件。

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/*')
Run Code Online (Sandbox Code Playgroud)