批量生成文件夹结构脚本

wen 实用脚本 4

本文目录导读:

批量生成文件夹结构脚本

  1. Python 脚本(最灵活)
  2. Bash 脚本(Linux/Mac)
  3. PowerShell 脚本(Windows)
  4. 配置文件示例(structure.json)
  5. 文件夹列表文件(folders.txt)
  6. 使用方法:

我来帮你生成一个批量创建文件夹结构的脚本,以下是几种常用方式:

Python 脚本(最灵活)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量生成文件夹结构脚本
支持自定义层级结构,自动创建嵌套文件夹
"""
import os
import json
from pathlib import Path
from datetime import datetime
class FolderGenerator:
    def __init__(self, base_path="."):
        """
        初始化文件夹生成器
        :param base_path: 基础路径,默认为当前目录
        """
        self.base_path = Path(base_path)
        self.created_folders = []
        self.log_file = None
    def create_folder_structure(self, structure_dict):
        """
        根据字典结构创建文件夹
        :param structure_dict: 文件夹结构字典,
            {
                "项目名称": {
                    "docs": {},
                    "src": {
                        "components": {},
                        "utils": {}
                    },
                    "tests": {}
                }
            }
        """
        for folder_name, sub_structure in structure_dict.items():
            self._create_recursive(folder_name, sub_structure)
        self._log_results()
    def _create_recursive(self, folder_path, sub_structure):
        """递归创建文件夹"""
        full_path = self.base_path / folder_path
        if not full_path.exists():
            full_path.mkdir(parents=True, exist_ok=True)
            self.created_folders.append(str(full_path))
            print(f"✅ 创建: {full_path}")
        # 递归创建子文件夹
        if isinstance(sub_structure, dict):
            for sub_name, sub_content in sub_structure.items():
                sub_path = f"{folder_path}/{sub_name}"
                self._create_recursive(sub_path, sub_content)
    def create_from_json(self, json_file):
        """从JSON文件读取结构创建"""
        with open(json_file, 'r', encoding='utf-8') as f:
            structure = json.load(f)
        self.create_folder_structure(structure)
    def create_default_project(self, project_name, include_git=False):
        """创建默认的项目结构"""
        default_structure = {
            project_name: {
                "src": {
                    "components": {},
                    "utils": {},
                    "assets": {},
                    "styles": {},
                    "templates": {}
                },
                "docs": {},
                "tests": {},
                "config": {},
                "scripts": {}
            }
        }
        self.create_folder_structure(default_structure)
        if include_git:
            gitignore_content = """# Python
__pycache__/
*.py[cod]
*.so
# Node
node_modules/
dist/
build/
# IDE
.idea/
.vscode/
*.swp
# 系统文件
.DS_Store
Thumbs.db
# 环境变量
.env
.env.local
"""
            gitignore_path = self.base_path / project_name / ".gitignore"
            gitignore_path.write_text(gitignore_content, encoding='utf-8')
            print(f"✅ 创建: .gitignore")
            readme_content = f"# {project_name}\n\n项目说明文档\n"
            readme_path = self.base_path / project_name / "README.md"
            readme_path.write_text(readme_content, encoding='utf-8')
            print(f"✅ 创建: README.md")
    def create_bulk_directories(self, folder_names, location="."):
        """批量创建同级文件夹"""
        target_path = self.base_path / location
        for name in folder_names:
            folder_path = target_path / name
            folder_path.mkdir(parents=True, exist_ok=True)
            self.created_folders.append(str(folder_path))
            print(f"✅ 创建: {folder_path}")
        self._log_results()
    def _log_results(self):
        """记录创建日志"""
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        log_file = self.base_path / f"folder_structure_log_{timestamp}.txt"
        with open(log_file, 'w', encoding='utf-8') as f:
            f.write(f"文件夹创建日志 - {datetime.now()}\n")
            f.write("=" * 50 + "\n\n")
            f.write(f"共创建 {len(self.created_folders)} 个文件夹:\n\n")
            for folder in self.created_folders:
                f.write(f"- {folder}\n")
        print(f"\n📄 日志已保存: {log_file}")
# 使用示例
if __name__ == "__main__":
    # 创建实例
    generator = FolderGenerator("./output")
    # 方式1: 创建默认项目结构
    # generator.create_default_project("my_project", include_git=True)
    # 方式2: 自定义结构
    custom_structure = {
        "web_project": {
            "frontend": {
                "src": {
                    "components": {},
                    "pages": {},
                    "assets": {},
                    "router": {}
                },
                "public": {},
                "tests": {}
            },
            "backend": {
                "api": {},
                "models": {},
                "services": {},
                "middlewares": {}
            },
            "database": {
                "migrations": {},
                "seeds": {},
                "backups": {}
            },
            "deployment": {
                "docker": {},
                "nginx": {},
                "scripts": {}
            }
        }
    }
    generator.create_folder_structure(custom_structure)
    # 方式3: 批量创建同级文件夹
    # folder_names = ["images", "videos", "documents", "archives", "temp"]
    # generator.create_bulk_directories(folder_names, "files")
    # 方式4: 从JSON文件读取
    # generator.create_from_json("structure.json")

Bash 脚本(Linux/Mac)

#!/bin/bash
# batch_create_folders.sh
# 批量创建文件夹结构
set -e  # 遇到错误立即退出
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 日志文件
LOG_FILE="folder_creation_$(date +%Y%m%d_%H%M%S).log"
# 创建文件夹函数
create_dirs() {
    local path=$1
    if [ ! -d "$path" ]; then
        mkdir -p "$path"
        echo "✅ 创建: $path" | tee -a "$LOG_FILE"
    else
        echo "⏭️ 已存在: $path"
    fi
}
# 创建多级目录
create_nested_dirs() {
    local base_dir=$1
    shift
    local dirs=("$@")
    for dir in "${dirs[@]}"; do
        create_dirs "$base_dir/$dir"
    done
}
# 菜单选择
show_menu() {
    echo "请选择创建方式:"
    echo "1) 创建项目结构"
    echo "2) 创建日期文件夹"
    echo "3) 自定义嵌套结构"
    echo "4) 从文件读取列表"
    echo "5) 退出"
}
# 创建日期文件夹
create_dated_folders() {
    local base_date_dir=$1
    local years=5
    for i in $(seq 0 $((years-1))); do
        year=$(( $(date +%Y) - i ))
        for month in {01..12}; do
            create_dirs "$base_date_dir/$year/$month"
        done
    done
}
# 主函数
main() {
    echo "🚀 批量文件夹创建工具"
    echo "======================"
    while true; do
        show_menu
        read -p "请输入选项 (1-5): " choice
        case $choice in
            1)
                echo "创建项目结构..."
                project_name="demo_project"
                create_nested_dirs "$project_name" "docs" "src/components" "src/utils" "src/assets" "tests" "config" "scripts"
                echo -e "${GREEN}✅ 项目结构创建完成${NC}"
                ;;
            2)
                echo "创建日期文件夹..."
                create_dated_folders "archive"
                echo -e "${GREEN}✅ 日期文件夹创建完成${NC}"
                ;;
            3)
                echo "自定义嵌套结构(用空格分隔):"
                echo "示例: src/components src/utils src/assets tests"
                read -p "输入目录结构: " custom_dirs
                read -p "基础目录名: " base_dir
                create_nested_dirs "$base_dir" $custom_dirs
                ;;
            4)
                echo "从文件读取文件夹列表..."
                echo "请创建 folders.txt 文件,每行一个路径"
                if [ -f "folders.txt" ]; then
                    while IFS= read -r folder; do
                        if [ -n "$folder" ]; then  # 跳过空行
                            create_dirs "$folder"
                        fi
                    done < "folders.txt"
                else
                    echo -e "${RED}未找到 folders.txt 文件${NC}"
                fi
                ;;
            5)
                echo "👋 再见!"
                break
                ;;
            *)
                echo -e "${RED}无效的选项${NC}"
                ;;
        esac
    done
    echo -e "${GREEN}日志已保存到: $LOG_FILE${NC}"
}
main

PowerShell 脚本(Windows)

# batch_create_folders.ps1
# Windows PowerShell 批量创建文件夹脚本
<#
.SYNOPSIS
批量创建文件夹结构脚本
.DESCRIPTION
支持多种方式的文件夹结构创建
#>
# 设置编码
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
# 日志函数
function Write-Log {
    param([string]$Message, [string]$Type = "INFO")
    $time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logMessage = "[$time] [$Type] $Message"
    Write-Host $logMessage
    Add-Content -Path $script:LogFile -Value $logMessage
}
# 创建文件夹函数
function New-FolderStructure {
    param(
        [string]$BasePath = ".",
        [string[]]$FolderList
    )
    foreach ($folder in $FolderList) {
        $fullPath = Join-Path $BasePath $folder
        if (-not (Test-Path $fullPath)) {
            New-Item -Path $fullPath -ItemType Directory -Force | Out-Null
            Write-Log "创建: $fullPath" "OK"
        } else {
            Write-Log "已存在: $fullPath" "SKIP"
        }
    }
}
# 创建日期文件夹
function New-DatedFolders {
    param(
        [string]$BasePath = "archive",
        [int]$Years = 5
    )
    $currentYear = Get-Date -Format "yyyy"
    for ($i = 0; $i -lt $Years; $i++) {
        $year = [int]$currentYear - $i
        for ($month = 1; $month -le 12; $month++) {
            $monthStr = "{0:D2}" -f $month
            $path = "$BasePath/$year/$monthStr"
            New-FolderStructure -BasePath $path -FolderList @()
        }
    }
}
# 创建项目结构
function New-ProjectStructure {
    param([string]$ProjectName)
    $folders = @(
        "src/components",
        "src/utils",
        "src/assets",
        "src/styles",
        "docs",
        "tests",
        "config",
        "scripts",
        "public"
    )
    New-FolderStructure -BasePath $ProjectName -FolderList $folders
    # 创建.gitignore
    $gitignore = @"
# Python
__pycache__/
*.py[cod]
# Node
node_modules/
dist/
# IDE
.idea/
.vscode/
"@
    Set-Content -Path "$ProjectName/.gitignore" -Value $gitignore -Encoding UTF8
    Write-Log "创建 .gitignore" "OK"
}
# 从文件读取文件夹列表
function Read-FolderListFile {
    param([string]$FilePath = "folders.txt")
    if (Test-Path $FilePath) {
        $folders = Get-Content $FilePath
        New-FolderStructure -BasePath "." -FolderList $folders
    } else {
        Write-Log "未找到文件: $FilePath" "ERROR"
    }
}
# 主菜单
function Show-Menu {
    Clear-Host
    Write-Host "`n=== 批量文件夹创建工具 ===" -ForegroundColor Cyan
    Write-Host "1. 创建项目结构"
    Write-Host "2. 创建日期文件夹"
    Write-Host "3. 自定义创建"
    Write-Host "4. 从文件读取"
    Write-Host "5. 退出"
    Write-Host "=========================`n"
}
# 自定义创建
function Custom-Create {
    Write-Host "输入文件夹列表(用逗号分隔):" -ForegroundColor Yellow
    Write-Host " src/components,src/utils,tests,docs"
    $input = Read-Host "文件夹列表"
    $folderList = $input -split "," | Where-Object { $_.Trim() -ne "" }
    New-FolderStructure -BasePath "." -FolderList $folderList
}
# 主程序
$script:LogFile = "folder_creation_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
# 清理旧的日志
if (Test-Path $LogFile) { Remove-Item $LogFile }
while ($true) {
    Show-Menu
    $choice = Read-Host "请选择选项"
    switch ($choice) {
        "1" {
            $projectName = Read-Host "输入项目名称"
            New-ProjectStructure -ProjectName $projectName
            Write-Host "✅ 项目结构创建完成" -ForegroundColor Green
        }
        "2" {
            New-DatedFolders
            Write-Host "✅ 日期文件夹创建完成" -ForegroundColor Green
        }
        "3" {
            Custom-Create
            Write-Host "✅ 自定义文件夹创建完成" -ForegroundColor Green
        }
        "4" {
            $filePath = Read-Host "输入文件夹列表文件路径 (默认: folders.txt)"
            if ([string]::IsNullOrEmpty($filePath)) { $filePath = "folders.txt" }
            Read-FolderListFile -FilePath $filePath
            Write-Host "✅ 从文件创建完成" -ForegroundColor Green
        }
        "5" {
            Write-Host "👋 再见!" -ForegroundColor Cyan
            break
        }
        default {
            Write-Host "❌ 无效选项" -ForegroundColor Red
        }
    }
    if ($choice -ne "5") {
        Write-Host "`n按任意键继续..." -ForegroundColor Gray
        $null = Read-Host
    }
}
Write-Host "日志已保存至: $LogFile" -ForegroundColor Yellow

配置文件示例(structure.json)

{
  "project_name": {
    "src": {
      "components": {},
      "pages": {},
      "utils": {},
      "assets": {
        "images": {},
        "fonts": {},
        "icons": {}
      },
      "styles": {},
      "templates": {}
    },
    "public": {},
    "docs": {
      "api": {},
      "guide": {}
    },
    "tests": {
      "unit": {},
      "integration": {},
      "e2e": {}
    },
    "config": {
      "development": {},
      "production": {},
      "test": {}
    },
    "scripts": {},
    "database": {
      "migrations": {},
      "seeds": {}
    }
  }
}

文件夹列表文件(folders.txt)

2024/01
2024/02
2024/03
projects/web/src/components
projects/web/src/utils
projects/mobile/android
projects/mobile/ios
backup/2024
backup/2023
docs/api
docs/manual

使用方法:

Python 脚本:

# 运行简单示例
python3 folder_generator.py
# 从JSON文件创建
python3 folder_generator.py structure.json

Bash 脚本:

# 添加执行权限
chmod +x batch_create_folders.sh
# 运行
./batch_create_folders.sh

PowerShell 脚本:

# 允许执行脚本(管理员权限)
Set-ExecutionPolicy RemoteSigned
# 运行
.\batch_create_folders.ps1

选择适合你需求的脚本,直接复制使用即可!

抱歉,评论功能暂时关闭!