使用Python根据扩展名将子目录的文件移动到指定目的目录

功能说明

将源目录下子目录中的文件移动到指定目的目录。要求如下:

  • 子目录中仅包含指定扩展名的文件才会移动文件。
  • 如果目的目录已包含同名文件,将文件重命名为原文件名 13位时间戳

例如:
当前目录结构如下:

test
│  2.txt
│
├─1
│  │  1.txt
│  │
│  └─22.txt
│
├─2
│  │  3.txt
│  │
│  └─3
└─3
        2.txt

运行后的目录结构如下:

test
│  2 1618156462496.txt
│  2.txt
│
├─1
│  │  1.txt
│  │
│  └─22.txt
│
├─2
│  │  3.txt
│  │
│  └─3
└─3

仅移动了子目录3中的2.txt。由于12子目录包含子目录,因此其目录中的文件不会被移动。

代码

import os
import shutil
import time
from pathlib import Path


# 生成时间戳
def now_to_timestamp(digits=13):
    time_stamp = time.time()
    digits = 10 ** (digits - 10)
    time_stamp = int(round(time_stamp*digits))
    return time_stamp

# 移动文件
def move_files(src_dir, dest_dir, ext_filter):
    '''
    src_dir:源目录
    dest_dir:目的目录
    ext_filter:扩展名列表
    '''
    # 获取源目录中的子目录和子文件
    sub_dirs = os.listdir(src_dir)
    # 遍历子目录、子文件
    for sub_dir in sub_dirs:
        # 构造子目录路径
        sub_dir_path = os.path.join(src_dir, sub_dir)
        # 遍历当前子目录
        for root, dirs, files in os.walk(sub_dir_path):
            # 只有当前子目录下仅有文件时,继续运行
            ext_list = [i for i in files if not i.lower().endswith(ext_filter)]
            if root == sub_dir_path and len(dirs) == 0 and len(files) > 0 and len(ext_list) == 0:
                for file in files:
                    # 构造文件路径
                    file_path = os.path.join(root, file)
                    new_file_path = os.path.join(dest_dir, file)
                    # 检测文件扩展名是否符合要求
                    if Path(file_path).suffix.lower() in ext_filter:
                        # 检测目的文件路径是否存在,不存在直接移动,存在更名后再移动
                        if not os.path.exists(new_file_path):
                            pass
                        else:
                            # 重命名文件
                            new_file_name = Path(
                                new_file_path).stem + " " + str(now_to_timestamp()) + Path(new_file_path).suffix
                            new_file_path = os.path.join(
                                dest_dir, new_file_name)
                        # 移动文件
                        shutil.move(file_path, new_file_path)
                        print(file_path, '->', new_file_path)


if __name__ == '__main__':
    src_dir = r'd:\test'
    dest_dir = r'd:\test'
    exts = ('.txt')
    move_files(src_dir, dest_dir, exts)
### 脚本实现:生成测试文件并按扩展名分类到子文件夹 以下是一个基于 Python 的脚本,用于在指定目录下生成测试文件,并根据文件扩展名将它们分类到不同的子文件夹中。此外,还提供了一个 Bash 脚本实现相同的功能。 #### Python 实现 ```python import os import random import string def generate_test_files(directory, num_files=10): """生成指定数量的测试文件""" extensions = ['.txt', '.csv', '.json', '.xml', '.log'] if not os.path.exists(directory): os.makedirs(directory) for _ in range(num_files): ext = random.choice(extensions) filename = ''.join(random.choices(string.ascii_lowercase, k=8)) + ext file_path = os.path.join(directory, filename) with open(file_path, 'w') as f: f.write("This is a test file.") def classify_files_by_extension(source_dir): """根据文件扩展名文件分类到子文件夹""" if not os.path.exists(source_dir): return for filename in os.listdir(source_dir): file_path = os.path.join(source_dir, filename) if os.path.isfile(file_path): _, ext = os.path.splitext(filename) if ext: target_dir = os.path.join(source_dir, ext[1:].upper()) if not os.path.exists(target_dir): os.makedirs(target_dir) os.rename(file_path, os.path.join(target_dir, filename)) if __name__ == "__main__": base_directory = "test_files" generate_test_files(base_directory) # 生成测试文件 classify_files_by_extension(base_directory) # 按扩展名分类文件 ``` 此脚本首先生成指定数量的测试文件[^5],然后根据文件扩展名将它们移动到相应的子文件夹中。例如,所有 `.txt` 文件将被移动到 `TXT` 子文件夹中。 #### Bash 实现 ```bash #!/bin/bash # 定义目标目录 BASE_DIR="test_files" # 创建目标目录 mkdir -p $BASE_DIR # 生成测试文件 for i in {1..10}; do EXTENSION=$(echo {txt,csv,json,xml,log} | tr ' ' '\n' | shuf -n1) FILENAME=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1).$EXTENSION echo "This is a test file." > "$BASE_DIR/$FILENAME" done # 按扩展名分类文件 for FILE in $BASE_DIR/*; do if [[ -f $FILE ]]; then EXTENSION=${FILE##*.} EXTENSION_DIR="$BASE_DIR/${EXTENSION^^}" mkdir -p "$EXTENSION_DIR" mv "$FILE" "$EXTENSION_DIR/" fi done ``` 此 Bash 脚本同样会生成测试文件并按扩展名分类到子文件夹中。它利用了 Shell 的强大命令如 `mkdir`、`mv` 和 `shuf` 等[^2]。 --- ### 注意事项 - 在 Python 实现中,`generate_test_files` 函数负责生成随机命名的测试文件,而 `classify_files_by_extension` 函数则负责将这些文件扩展名分类。 - 在 Bash 实现中,使用了 `shuf` 命令来随机选择文件扩展名,并通过 `mv` 命令将文件移动到相应的子文件夹中[^3]。 - 如果需要打包 Python 脚本为可执行文件,可以参考 Nuitka 工具的相关用法[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值