2014-09-03 48 views
3

我的问题全部复制某些扩展名的文件,同时保持目录树

  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) 

此打印正确:

D:\folder\build\a.h 
D:\folder\build\b.h 
D:\folder\build\subfolder\c.h 
D:\folder\build\subfolder\d.h 

当我被困

随着完整的文件路径列表,我怎么才能将这些文件复制到另一个位置,同时保持子目录?在上面的例子中,我要保持低于\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 

回答

6

可以使用shutil.copytree忽略可调用以过滤要复制的文件。

“如果给出了忽略,它必须是一个可调用函数,它将接收由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) 
+2

python3'ignore_func = lambda d,files:[f for f in file if(Path(d)/ Path(f))。is_file()and f.endswith('.py')] ' – 2017-05-12 15:30:52

2

编辑:正如@pchiquet所示,它可以在一个命令中完成。然而,我会展示如何手动处理这个问题。

你需要三件事情。

你知道你遍历哪个目录,所以要构建的目标路径,你需要去的目的地根目录的名称替换源根目录的名称:

walked_directory = 'D:\folder\build' 
found_file = 'D:\other\subfolder\build\a.h' 
destination_directory = 'D:\other\subfolder' 
destination_file = found_file.replace('walked_directory', 'destination_directory') 

现在,你有源和目的,首先你需要确保目标存在:

os.makedirs(os.path.dirname(destination_file)) 

一旦它的存在,你可以复制文件:

shutil.copyfile(found_file, destination_file) 
相关问题