Итеративно (или рекурсивно?) Фильтровать каталог и копировать результаты в новый каталог

Я новичок в Python и преподаю себе учебники и StackOverflow. Кажется, я лучше всего научился примерам реального мира с этого сайта. Я надеюсь, кто-то может помочь мне с моей текущей проблемой.

У меня есть каталог (папка) с примерно 1000 файлами. Файлы имеют имена с префиксами (шаблонами), такими как aaa_* , bbb_* , ccc_* и т. Д. Я хотел бы выполнить итерацию по каталогу и скопировать все файлы с указанным префиксом и перенести их в новый каталог с этим именем префикса. Например, найдите все файлы aaa_* в /my_dir_path и скопируйте их в /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 – это как рекурсивно запустить fnmatch.filter для моего списка шаблонов, а затем, в конечном счете, вывести файлы в их собственный каталог.

Я попытался написать несколько различных определений функций со списком шаблонов как *args , но обычно получал сообщение об ошибке, что «filter () принимает ровно 2 аргумента (3 данных)». (Я прошу прощения за отсутствие примеров кода, чтобы показать вам здесь. За последние несколько дней у меня было так много версий, что у меня нет какого-либо одного определения функции функции.)

Я такой новичок, что не знаю, может ли fnmatch.filter быть рекурсивным или как разработать альтернативную стратегию. Затем возникает проблема сохранения полученных файлов из каждого поиска шаблонов в его собственный каталог. Я думал, что могу заранее создать словарь, например,

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

и сохраните полученные файлы как значения под соответствующим ключом, но учитывая, что я даже не получил рекурсию для работы (т. е. печать), я не работал над тем, как скопировать результаты в новый каталог.

Теперь я не тестировал это, так как у меня нет всех файлов для тестирования. Тем не менее, я бы просто превратил переменную «шаблон» в список и добавил другую для цикла. Я также изменил переменную «dest», чтобы мы могли просто использовать список «шаблонов».

 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+'/')