遍历 folder/sub-directories 并将找到的正则表达式文件移动到新文件夹中

Iterate through folder/sub-directories and move found regex files into new folder

我有一个 folder/sub-directories 结构如下:

-main_folder
    -sub_1
         322.txt
         024.ops
    -sub_2
         977.txt
         004.txt
    -sub_3
         396.xml
         059.ops

我正在尝试使用 os.walk 遍历文件夹及其子目录,并收集这些文件夹中的名称。当正则表达式规则找到名称时,我想将路径存储在列表中或直接将该文件移动到新文件夹 (mkdir)。

我已经完成正则表达式以查找我想要的文档。 例如:

find_000_099 = r'\b(0\d{2}.\w{1,4})'
find_300_399 = r'\b(3\d{2}.\w{1,4})'
find_900_999 = r'\b(9\d{2}.\w{1,4})'

我希望我的预期结果是这样的:

-main_folder
    -sub_from_000_099
         024.ops
         004.txt
         059.ops
    -sub_from_300_399
         322.txt
         396.xml
    -sub_from_900_999
         977.txt

您可以使用下面给出的代码,将文件从其初始目录移动到所需目录。

import os
import re
import shutil

find_000_099 = r'\b(0\d{2}.\w{1,4})'
find_300_399 = r'\b(3\d{2}.\w{1,4})'
find_900_999 = r'\b(9\d{2}.\w{1,4})'

count = 0

for roots,dirs,files in os.walk('Directory Path'):
    #print(roots, len(dirs), len(files))
    if count == 0:
        parent_dir = roots
        os.mkdir ( parent_dir  + "/sub_from_000_099" )
        os.mkdir ( parent_dir  + "/sub_from_300_399" )
        os.mkdir ( parent_dir  + "/sub_from_900_999" )
        count += 1
    else:
        print(count)
        for file in files:
            print(file)
            if re.match(find_000_099, file):
                shutil.move ( roots + "/" + file, parent_dir + "/sub_from_000_099/" + file)
            elif re.match ( find_300_399, file ):
                shutil.move ( roots + "/" + file, parent_dir + "/sub_from_300_399/" + file )
            elif re.match ( find_900_999, file ):
                shutil.move ( roots + "/" + file, parent_dir + "/sub_from_900_999/" + file )

这是一个框架代码,可以满足您的要求。 您可以添加对创建目录的检查,首先检查目录是否存在,然后根据需要进行其他检查。

这里有一个更简单的方法,使用pathlib和shutil

import re
import shutil
from pathlib import Path

new_path = Path("new_folder")
if not new_path.exists(): new_path.mkdir()

# Getting all files in the main directory
files = Path("main_folder").rglob("*.*")

regs = {
    r'\b(0\d{2}.\w{1,4})': "sub_1", # find_000_099
    r'\b(3\d{2}.\w{1,4})': "sub_2", # find_300_399
    r'\b(9\d{2}.\w{1,4})': "sub_3"  # find_900_999
}

for f in files:
    for reg in regs:
        if re.search(reg, f.name):
            temp_path = new_path / regs[reg]
            if not temp_path.exists(): temp_path.mkdir()

            # Change the following method to 'move' after testing it
            shutil.copy(f, temp_path / f.name)
            break