复制具有特定扩展名的所有文件,同时保留目录树

Cor*_*mer 4 python

我的问题:

  1. 遍历目录,找到所有头文件*.h.
  2. 将所有这些文件复制到另一个位置,但维护目录树

我尝试过的:

我已经能够使用os库收集所有标题

for root, dirs, files in os.walk(r'D:\folder\build'):
    for f in files:
        if f.endswith('.h'):
            print os.path.join(root, f)
Run Code Online (Sandbox Code Playgroud)

这正确打印:

D:\folder\build\a.h
D:\folder\build\b.h
D:\folder\build\subfolder\c.h
D:\folder\build\subfolder\d.h
Run Code Online (Sandbox Code Playgroud)

我被困在哪里:

使用完整文件路径列表,如何在维护子目录的同时将这些文件复制到另一个位置?在上面的例子中,我想要维护下面的目录结构\build\

例如,我希望副本创建以下内容:

D:\other\subfolder\build\a.h
D:\other\subfolder\build\b.h
D:\other\subfolder\build\subfolder\c.h
D:\other\subfolder\build\subfolder\d.h
Run Code Online (Sandbox Code Playgroud)

pch*_*uet 6

您可以将shutil.copytreeignore callable一起使用来过滤要复制的文件.

"如果给出忽略,它必须是一个可调用的,它将接收copytree()访问的目录作为其参数,以及它的内容列表(...).可调用的必须返回一系列相对的目录和文件名到当前目录(即第二个参数中的项的子集);这些名称将在复制过程中被忽略"

所以对于你的具体情况,你可以写:

from os.path import join, isfile
from shutil import copytree

# ignore any files but files with '.h' extension
ignore_func = lambda d, files: [f for f in files if isfile(join(d, f)) and f[-2:] != '.h']
copytree(src_dir, dest_dir, ignore=ignore_func)
Run Code Online (Sandbox Code Playgroud)

  • 在python3`ignat_func = lambda d中,files:[f for f in files if if(Path(d)/ Path(f)).is_file()和f.endswith('.py')]` (3认同)