根据文件名对文件进行分类,移动到以部分文件名命名的文件夹下

本文介绍了一个Python脚本,用于自动化地分类和移动特定格式的文件到相应目录,提高了文件管理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[~/Japan_Project/ENM_Migration/Migration_Activity/temp]$ ls
Clssified_CV.py*
134727_L2G-KASUGAISHI011W_ENM_134727_180919_AFTER.zip
134727_L2G-KASUGAISHI011W_ENM_134727_180919_BEFORE.zip
134728_L2G-chenghuang_ENM_134727_180919_AFTER.zip
134728_L2G-chenghuang_ENM_134727_180919_BEFORE.zip

[~/Japan_Project/ENM_Migration/Migration_Activity/temp]$ python Classified_CV.py >> ./Clssified_CV.Log
---  new folder...---
---start move 134727_L2G-KASUGAISHI011W_ENM_134727_180919_AFTER.zip to 134727_L2G-KASUGAISHI011W---
---file move done---
---start move 134727_L2G-KASUGAISHI011W_ENM_134727_180919_BEFORE.zip to 134727_L2G-KASUGAISHI011W---
---file move done---
---  new folder...---
---start move 134728_L2G-chenghuang_ENM_134727_180919_AFTER.zip to 134728_L2G-chenghuang---
---file move done---
---start move 134728_L2G-chenghuang_ENM_134727_180919_BEFORE.zip to 134728_L2G-chenghuang---
---file move done---

[~/Japan_Project/ENM_Migration/Migration_Activity/temp]$ ls
134727_L2G-KASUGAISHI011W/  134728_L2G-chenghuang/  Clssified_CV.py* Clssified_CV.Log

[~/Japan_Project/ENM_Migration/Migration_Activity/temp]$ cd 134727_L2G-KASUGAISHI011W/
[~/Japan_Project/ENM_Migration/Migration_Activity/temp/134727_L2G-KASUGAISHI011W]$ ls
134727_L2G-KASUGAISHI011W_ENM_134727_180919_AFTER.zip
134727_L2G-KASUGAISHI011W_ENM_134727_180919_BEFORE.zip

[~/Japan_Project/ENM_Migration/Migration_Activity/temp]$ cd 134728_L2G-chenghuang/
[~/Japan_Project/ENM_Migration/Migration_Activity/temp/134728_L2G-chenghuang]$ ls
134728_L2G-chenghuang_ENM_134727_180919_AFTER.zip
134728_L2G-chenghuang_ENM_134727_180919_BEFORE.zip

脚本为Classified_CV.py

#!/usr/bin/python
import os, shutil, re

def mkdir(path):

    folder = os.path.exists(path)

    if not folder:
        os.makedirs(path)
        print("---  new folder...---")
    else:
        pass

rootdir = "./"
folder_list = []
for parent,dirnames,filenames in os.walk(rootdir):  #遍历当前目录的文件
    for filename in filenames:
        if not (re.match('\w*.py',filename) or re.match('\w*.Log',filename)):  #这里过滤掉工作目录下的python脚本和生成的log文件
            folder_name = filename.split('_ENM_',1)[0]  #对文件名进行一次拆分,拆分标志为_ENM_,这里取拆分后的列表的第一个元素
            mkdir(folder_name)
            if (folder_name in filename) and not os.path.exists("./" + folder_name + "/" + filename):
                print("---start move " + filename + " to " + folder_name + "---")
                shutil.move(filename,"./" + folder_name)    #移动文件到相关联的文件夹
                print("---file move done---")
<think>我们使用批处理脚本(.bat)来实现以下功能: 1. 遍历指定目录下的所有文件(不包括目录) 2. 提取文件名(不含扩展名)和扩展名 3. 根据文件名中的特定部分(例如,文件名中包含的文件夹名)来移动文件到对应的文件夹 但是,根据用户之前的问题,他想要的是:如果文件名包含在文件夹名内,将文件移动到对应文件夹下。 然而,现在用户的新问题是:“我想使用批处理脚本提取文件名、重命名文件,并将其移动到指定文件夹” 注意:用户的新需求有三个步骤:提取文件名、重命名文件移动文件到指定目录。 由于用户的需求可能有所变化,我们结合之前的上下文和新的需求,设计一个批处理脚本,实现: 1. 遍历源目录下的所有文件(不处理文件夹) 2. 提取文件名(可以提取部分内容作为新的文件名,或者直接使用原文件名,但用户要求重命名,所以我们需要知道重命名的规则) 3. 重命名文件(这里需要用户提供重命名的规则,但问题中没有明确,所以我们假设一种常见情况:例如从文件名中提取特定部分作为新文件名,或者添加前缀后缀等) 4. 将重命名后的文件移动到指定目录(这个目录可以是根据文件名中的一部分确定的,也可以是固定的) 但是,用户之前的需求是“如果文件名包含在文件夹名内,将文件移动到对应文件夹下”,现在又增加了重命名。 由于问题描述不够具体,我们设计一个灵活的方案: 方案一:先移动文件到对应文件夹(按照之前的需求),然后再重命名(按照新的规则)。但是重命名的规则没有给出。 方案二:先重命名,再根据文件名(或原文件名)中的关键部分移动到对应文件夹。 由于用户没有给出重命名的具体规则,我们假设重命名是提取文件名中的某一部分(例如,文件名中可能包含日期、序号等,我们无法确定)。因此,我们只能做一个示例,展示如何提取文件名的一部分作为新文件名,然后根据文件名(或原文件名)中的关键字符串匹配文件夹名,并移动。 这里我们假设: 1. 重命名规则:从原文件名中提取前8个字符作为新文件名(假设前8位是日期,如20240520),保留扩展名。 2. 移动规则:将文件移动文件名中包含其名字的文件夹中(即新文件名中包含文件夹名,则移动过去)。 但是,由于用户的需求不明确,我们也可以提供两个分离的步骤,或者让用户自定义规则。 考虑到批处理的灵活性,我们设计一个脚本,允许用户自定义重命名的规则(通过修改变量或使用字符串操作),然后按照之前匹配文件夹的方式移动。 由于批处理脚本功能有限,我们尽量简化。 以下脚本实现: 步骤1:遍历当前目录下的所有文件(不包括子目录中的文件,但可以修改为递归) 步骤2:对每个文件,提取文件名(不含扩展名)和扩展名 步骤3:对文件名进行重命名(这里我们使用一个示例规则:将文件名中的空格替换为下划线,并添加前缀“new_”) 步骤4:然后查找当前目录下的所有子文件夹,如果新文件名(不含扩展名)中包含某个子文件夹的名字,则将此文件移动到该子文件夹中 注意:如果同时匹配多个文件夹,我们只移动到第一个匹配的文件夹。为了避免错误,我们可以要求文件夹名在文件名中出现的位置是唯一的,或者使用最长的匹配。 由于批处理中字符串匹配的局限性,我们使用循环遍历所有子文件夹。 脚本如下(请根据实际情况修改):</think>### 批处理脚本:提取文件名、重命名文件移动到指定目录 以下是实现文件提取、重命名移动功能的完整批处理脚本,结合了您提到的需求和相关引用内容: ```batch @echo off setlocal enabledelayedexpansion :: 配置参数 - 按需修改 set "source_dir=D:\source" &:: 源目录路径 set "target_dir=D:\target" &:: 目标目录路径 set "file_prefix=NEW_" &:: 新文件名前缀 set "log_file=operation_log.txt" &:: 操作日志文件 :: 创建目标目录(如果不存在) if not exist "%target_dir%" ( mkdir "%target_dir%" echo [%date% %time%] 创建目标目录: %target_dir% >> "%log_file%" ) :: 遍历源目录所有文件 for /r "%source_dir%" %%F in (*.*) do ( set "original_file=%%~nxF" set "original_path=%%~dpF" set "extension=%%~xF" :: 提取纯文件名(不含扩展名) set "base_name=!original_file:%extension%=!" :: 生成新文件名(添加前缀+原始文件名) set "new_name=%file_prefix%!base_name!%extension%" :: 移动并重命名文件 move "%%F" "%target_dir%\!new_name!" >nul :: 记录操作日志 echo [%date% %time%] 移动: !original_path!!original_file! ^> %target_dir%\!new_name! >> "%log_file%" ) echo 操作完成!共处理 %count% 个文件 echo 详细日志请查看: %log_file% pause ``` #### 使用说明: 1. **修改配置参数**(脚本开头的变量): ```batch set "source_dir=D:\source" &:: 改为您的源目录 set "target_dir=D:\target" &:: 改为目标目录 set "file_prefix=NEW_" &:: 新文件名前缀(可自定义) ``` 2. 保存为 `.bat` 文件(如 `file_processor.bat`) 3. 双击运行脚本 #### 关键功能说明: 1. **文件名提取** 使用 `%%~nxF` 提取完整文件名,`%%~xF` 提取文件扩展名 2. **重命名规则** 新文件名格式:`前缀 + 原文件名 + 原扩展名` (可通过修改 `file_prefix` 变量自定义) 3. **文件移动** 使用 `move` 命令将文件转移到目标目录: ```batch move "源文件" "目标目录\新文件名" ``` 4. **日志记录** 所有操作记录到日志文件(默认 `operation_log.txt`),包含: - 操作时间戳 - 原始文件路径 - 新文件路径 - 目录创建记录 #### 高级定制示例: 1. **添加日期后缀**: ```batch :: 在重命名部分添加 set "new_name=%file_prefix%!base_name!_%date:/=-%%time:~0,2%%time:~3,2%!extension!" ``` 生成文件名示例:`NEW_report_2024-05-201430.txt` 2. **按扩展名分类存放**: ```batch :: 在move命令前添加 if not exist "%target_dir%\!extension!" mkdir "%target_dir%\!extension!" move "%%F" "%target_dir%\!extension!\!new_name!" ``` 效果:`.txt` 文件存入 `target\txt\`,`.jpg` 存入 `target\jpg\` 3. **删除特定字符**: ```batch :: 在设置base_name后添加 set "base_name=!base_name:old_text=!" ``` 示例:`set "base_name=!base_name:temp_=!"` 删除所有"temp_"字符串 > **重要提示**: > 1. 首次使用前建议备份文件 > 2. 测试时可注释掉 `move` 命令(行首加 `::`) > 3. 特殊字符文件名需额外处理[^1] > 4. 更多批处理技巧参考文档[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值