迭代(或递归?)过滤目录并将结果复制到新目录

Iteratively (or recursively?) filter directory and copy results to new directory

我是 Python 的新手,一直在使用教科书和 Whosebug 自学。我似乎从这个网站的真实世界的例子中学到了最好的东西。我希望有人能帮助我解决我目前的问题。

我有一个包含大约 1,000 个文件的目录(文件夹)。这些文件的名称带有前缀(模式),例如 aaa_*bbb_*ccc_* 等。我想遍历目录并复制所有具有指定前缀的文件并将它们移动到具有该前缀名称的新目录。例如,找到 /my_dir_path 中的所有 aaa_* 文件并将它们复制到 /my_new_dir_path/aaa,同样将所有 bbb_* 复制到 /my_new_dir_path/bbb。新目录已创建。

以下简单的样板脚本可用于将前缀模式之一复制到新目录:

dir = '/my_dir_path'
pattern = 'aaa_*'
dest = '/my_new_dir_path/aaa'

for root, dirs, files in os.walk(dir):
    for filename in fnmatch.filter(files, pattern):
        source = (os.path.join(root, filename))
        shutil.copy2(source, dest)

我正在努力解决的问题是如何递归 运行 fnmatch.filter 我的模式列表,然后最终将文件输出到它们自己的目录中。

我曾尝试使用 *args 模式列表编写许多不同的函数定义,但通常会收到一条错误消息,即“filter() 恰好需要 2 个参数(给定 3 个)”。 (很抱歉没有代码示例在这里向您展示。这几天我经历了很多版本,我没有一个具有代表性的函数定义。)

我是个新手,我不知道 fnmatch.filter 是否可以递归或如何设计替代策略。然后,就是如何将每个模式搜索的结果文件存储到自己的目录中的问题。我在想我可以提前创建一个字典,例如

my_dict = {'my_new_dir_path/aaa': 'aaa_*', 'my_new_dir_path/bbb': 'bbb_*'}

并将生成的文件作为值存储在适当的键下,但考虑到我什至没有让递归工作(即打印),我还没有研究如何将结果复制到新目录.

现在我还没有测试这个,因为我没有所有的文件来测试。但是,我只是将“pattern”变量设为一个列表并添加另一个 for 循环。我还更改了“dest”变量,这样我们就可以使用“patterns”列表了。

import os
import shutil
import fnmatch

dir = '/my_dir_path'
patterns = ['aaa', 'bbb', 'ccc']
dest = '/my_new_dir_path/'

for root, dirs, files in os.walk(dir):
    for pattern in patterns:
        for filename in fnmatch.filter(files, pattern+'_*'):
            source = (os.path.join(root, filename))
            shutil.copy2(source, dest+pattern+'/')