2011-08-01 98 views
3

我想递归复制一个目录到另一个目录。我也想忽略一些文件(例如,所有隐藏的文件;以“。”开头的所有文件),然后在所有其他文件上(复制它们之后)运行一个函数。这在shell中很简单,但我需要一个Python脚本。在Python中跳过一些目录递归复制文件?

我试过使用shutil.copytree,它忽略了支持,但我不知道如何让它在复制的每个文件上做一个函数。我可能还需要在复制时检查其他一些条件,以便在复制完所有文件后,我不能只运行该功能。我也试着看os.walk,但我无法弄清楚。

+1

告诉我们你试过了什么,以及你卡在哪里。 – utdemir

+1

@utdemir确定,添加了几行,这是更好吗? – VPeric

+0

“运行文件上的函数”是什么意思?你打算打开并阅读它们,或者什么? –

回答

7

您可以使用os.walk遍历每个文件,应用您的自定义过滤功能并仅复制您关心的那些文件。

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 

步行树无论是自上而下还是自下而上生成的目录树中的文件名。对于根目录顶部(包括顶部本身)树中的每个目录,它会生成一个3元组(dirpath,dirnames,文件名)。

您可以将所有复制的文件添加到列表中,并使用它运行自定义脚本或在每次复制操作后运行脚本。

这应该让你开始:

import os 

def filterls(src, filter_func): 
    for root, dirs, files in os.walk(src): 
     for f in files: 
      if filter_func(f): 
       path = os.path.join(root, f) 
       yield path[len(src)+1:] 

它需要一个目录路径并带有一个参数的函数。如果函数为传入的文件名返回False,则该文件将被忽略。

,您可以尝试在Python解释是这样的:

# Get a list of all visible files rooted in the 'path/to/the/dir' directory 
print list(filterls('path/to/the/dir', lambda p: not p.startswith('.'))) 
+1

我尝试os.walk,但我有点困惑。你能否提供一个例子? – VPeric

+0

@Veric:现在好点? – GaretJax

4

如果你对Python的2.6或更高版本,你可以简单地使用shutil.copytree及其ignore说法。由于它通过了​​所有的文件和目录,你可以从那里调用你的函数,除非你想在之后立即调用复制文件。

如果是这样,最简单的事情就是复制和修改copytree的代码。

+1

我也想支持Python 2.5,但这不是一个硬性要求。另外,请参阅我对编辑的回答,但我无法弄清楚如何将自定义函数应用于每个复制文件(满足某些条件)。 – VPeric