按模板批量创建文件夹:三种方案保留目录结构

新项目启动时,最先做的往往不是写代码,而是建文件夹。很多团队都有过这样的“返工瞬间”:产品要从三个模块扩成十个模块,于是在文件管理器里一个一个新建目录;文档规范要求 docs 下面必须同时有 design、api、manual 三个子目录,结果漏建了几个;微服务拆分后,十几个服务要使用同一套目录规范,手工创建既慢又不统一。等第一版目录建完,review 的同事一看,层级错位、命名粗细不一、空目录丢失,又得推倒重来。

按模板批量创建文件夹并保留结构,正是为了解决这类问题。它的核心不是“省几次鼠标点击”,而是把目录结构变成可复用的模板,把创建过程变成可执行的脚本,让每一次新建都能得到完全一致、符合规范的结果。这篇文章我会先讲清楚“模板化批量创建”到底在解决什么,然后给出三种由浅入深的方案:Shell 一行命令、JSON 模板加 Python 递归创建、复制模板目录保留完整结构。读完你可以直接用这些脚本跑通自己的场景。

1. 为什么要按模板批量创建文件夹

批量创建文件夹听起来没有技术含量,但真正到项目里,它往往是规范执行最容易出问题的环节。

先看几个典型场景。

第一个是模块化工程初始化。比如你要开发一个多模块的 Java 项目,约定每个模块下都有 src/main/java、src/test/java、src/main/resources、docs、scripts 五个目录。十个模块就是五十个目录,人工创建时只要少一个,后续构建脚本、自动扫描、文档发布都会踩坑。

第二个是数据治理类项目。数据目录一般有严格的层级约定,比如 data/{来源系统}/{数据域}/{数据表}/{snapshot|archive|output}。如果数据表有几十张,每一张都要建三个子目录,手工创建又累又容易漏。模板脚本可以先把层级定义好,一次生成。

第三个是课程、文档体系、模板仓库这类“以目录为资产”的项目。目录结构本身就是交付物,每次新建课程或内容专题都要重现同一套结构。这时候你需要的不是复制上次的文件夹,而是有一个标准模板,能生成新的独立目录,并且把需要替换的名称自动填进去。

我们常说的“按模板批量创建文件夹”,本质上包含三个关键要求:

  • 模板化:目录结构不再靠记忆,而是记录在模板文件里,人人可见,纳入版本管理。
  • 批量创建:一套结构可以重复生成,循环或递归执行,而不是手工点鼠标。
  • 保留结构:不仅是“目录存在”,还包括层级关系、空目录、隐藏文件,甚至在必要时保留文件权限。

注意,很多人会误以为“批量创建文件夹”只要会 mkdir 就够了。实际上,如果只创建单个目录,那确实不需要模板;一旦目录树是多层嵌套、多个分支、多套实例,就需要用模板去描述这棵树,用脚本去生成这棵树。真正难的不是创建目录本身,而是让生成结果每次都能保持一致。

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 核心概念:模板、批量创建与保留结构

进入实操之前,先把三个容易混淆的概念说清楚。

目录模板不是文件夹快照,而是一份结构描述。最简单的模板是一棵目录树,由节点和父子关系组成。每个节点有一个名字,节点下面可以有零个或多个子节点。模板与普通目录的区别在于:模板里允许存在占位符,例如 ${PROJECT_NAME},创建时这些占位符会被替换成实际值。

“批量创建文件夹”指的是根据这份描述,自动生成多级目录。实现方式有两种路线。第一种是“执行命令”,比如 mkdir -p a/b/c,适合固定层级、一次性的场景。第二种是“运行脚本”,脚本读取模板文件,递归创建目录树,适合需要复用、需要变量替换、需要控制流程的场景。这里的关键不是命令有多复杂,而是创建逻辑是否可重复、可审计。

“保留结构”则是最容易被忽略的部分。它至少包含四个方面:

  • 保留层级关系:src/main/java 不能变成 src/main 下直接丢文件。
  • 保留空目录:很多模板里会有空的 scripts、docs 目录,建完不能消失。
  • 保留隐藏文件和文件占位:比如 .gitignore、.env.example、.gitkeep,它们是结构的一部分,不能被过滤掉。
  • 保留权限和属性:在 Linux 环境,可执行脚本目录或文件需要有合适的权限;在 Windows 环境,可能要保留只读属性。

还有一个概念值得提前说明:占位符格式。你可以用 ${PROJECT_NAME}、{{PROJECT_NAME}}、%(PROJECT_NAME)s,解析脚本支持哪种就用哪种。这不重要,重要的是团队内统一。文章后面的示例统一使用 ${PROJECT_NAME} 作为目录名变量,使用 {{PROJECT_NAME}} 作为文件内容变量,目的是让两种场景区分开,不会混淆。

从实现层次看,模板化批量创建是一个典型的三层结构:模板层负责描述“长什么样”,解析层负责把变量替换成实际值,执行层负责创建目录并打印结果。理解了这个分层,无论用什么语言写脚本,思路都是相通的。

3. 环境准备与前置条件

这套方案对运行环境没有苛刻要求,主要准备三样东西。

操作系统方面,Windows、Linux、macOS 都可以。文章里的示例会分别给出 bash 版和 PowerShell 版,以及 Python 版。跨平台场景下,推荐把 Python 作为主力方案。

运行环境方面,建议提前准备 Python 3。版本不需要写死,文章代码使用的是标准库 pathlib、argparse、shutil、json,不依赖第三方包。如果你的机器上已经有 Python 3.8 或更高版本,直接就能运行。检查方式:

bash复制python --version

如果命令不存在,试试 python3 --version:

bash复制python3 --version

开发工具上,一个顺手的编辑器就够了。命令行终端是必须的,因为所有示例都是命令行脚本。Windows 用户如果使用 PowerShell,注意脚本运行策略;如果使用 Windows Terminal 加 Git Bash,也可以运行 bash 示例。

还需要准备一个临时测试目录,建议在 /tmp 或 ~/projects/demo 下操作,避免在项目根目录乱建目录后不好清理。所有示例都是为了验证结构是否正确,请在一个不重要的目录里测试跑通,再正式使用。

4. 方法一:Shell 一行命令批量创建固定目录结构

如果你的目录结构固定、层级不深,而且不需要变量替换,最快的方法是 Shell 命令。

在 Linux 或 macOS 的 bash/zsh 环境中,使用大括号扩展可以一条命令创建多个目录层级:

bash复制mkdir -p my_project/{src/main/java,src/test/java,docs/{api,design},scripts}

这行命令执行后会创建以下结构:

code复制my_project/
├── src/
│   ├── main/
│   │   └── java/
│   └── test/
│       └── java/
├── docs/
│   ├── api/
│   └── design/
└── scripts/

这个示例的关键在 -p 参数,它表示“没有父目录就创建父目录”,避免一层层 mkdir。大括号内的逗号分隔多个分支,大括号之间可以嵌套。bash 会把每个组合展开成一条路径,交给 mkdir 创建。

现实生活中,我见过很多开发者用 mkdir -p a b c 创建平铺目录,这没错,但一旦目录有分支,大括号扩展才是真正节约时间的写法。要注意,大括号写法只在 bash/zsh 下可用,纯 sh 环境不一定支持。需要验证是否生效时,先加 echo 看展开结果:

bash复制echo my_project/{src/main/java,src/test/java,docs/{api,design},scripts}

如果输出的列表是五条完整路径,说明环境支持大括号扩展;再换成 mkdir -p 执行,就比较稳妥。

Windows 的 PowerShell 也支持批量创建,思路是构造路径数组,再交给 New-Item:

powershell复制$dirs = @(
    "src\main\java",
    "src\test\java",
    "docs\api",
    "docs\design",
    "scripts"
)

New-Item -ItemType Directory -Path $dirs -Force

注意两个细节:一是路径分隔符在 Windows 下习惯用反斜杠,二是 -Force 的作用是“目录已存在时不报错”,类似 Linux 的 -p。这段 PowerShell 会创建当前目录下的这些层级,但不会自动加上 my_project 根目录,所以如果你需要外层根目录,就把 my_project 写到路径数组里,或者在执行前先 New-Item -ItemType Directory -Path "my_project" -Force。

Shell 方案的边界在于:它适合一次性、固定目录结构。想让它“按模板可复用”,你可以包一层函数,把路径数组固化在脚本里:

bash复制create_project_dirs() {
    local project_name="$1"
    mkdir -p "$project_name/src/main/java" \
             "$project_name/src/test/java" \
             "$project_name/docs/api" \
             "$project_name/docs/design" \
             "$project_name/scripts"
}

这样每次只需执行 create_project_dirs demo_project。但这个方案对变量替换、文件占位、权限保留的支持都比较弱,当结构变成 JSON 描述时,我们就要进入下一个方法。

5. 方法二:JSON 模板 + Python 递归创建

如果目录结构复杂、需要复用、还要做变量替换,我推荐用 JSON 模板加 Python 脚本。这套方案的思路是:用 JSON 准确描述目录树,用 Python 递归读取并创建目录,整个过程可以先 --dry-run 预览,再真正执行。

5.1 模板文件结构设计

新建一个文件 project_template.json,内容如下:

json复制{
  "name": "${PROJECT_NAME}",
  "children": [
    {
      "name": "src",
      "children": [
        {
          "name": "main",
          "children": [
            { "name": "java", "children": [] },
            { "name": "resources", "children": [] }
          ]
        },
        {
          "name": "test",
          "children": [
            { "name": "java", "children": [] }
          ]
        }
      ]
    },
    {
      "name": "docs",
      "children": [
        { "name": "design", "children": [] },
        { "name": "api", "children": [] }
      ]
    },
    {
      "name": "scripts",
      "children": []
    }
  ]
}

模板中的 name 是当前目录名,children 是子目录列表。没有子节点时写空数组 [],千万不要把 children 写成 null,否则 Python 代码里要单独处理。

这种设计的优势是目录树可以被任何语言解析,不绑定 Python。你可以把模板文件放到项目的 templates/ 目录,也可以纳入 Git 仓库,和代码一起评审。

5.2 Python 递归创建脚本

新建文件 create_dirs.py,内容如下:

python复制#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
按模板批量创建文件夹并保留结构。

用法示例:
    python create_dirs.py project_template.json --project demo_project --dry-run
    python create_dirs.py project_template.json --project demo_project
"""
import argparse
import json
import re
from pathlib import Path

PLACEHOLDER_PATTERN = re.compile(r"\$\{(.*?)\}")


def read_template(template_path):
    with open(template_path, "r", encoding="utf-8") as f:
        return json.load(f)


def render_name(name, variables):
    """将目录名中的 ${VAR} 替换为实际值。"""
    def replace(match):
        key = match.group(1).strip()
        return variables.get(key, match.group(0))

    return PLACEHOLDER_PATTERN.sub(replace, name)


def create_tree(node, parent, variables, dry_run=False):
    raw_name = node.get("name", "")
    if not raw_name:
        return

    name = render_name(raw_name, variables)
    current = parent / name

    if dry_run:
        print("create:", current)
    else:
        current.mkdir(parents=True, exist_ok=True)

    children = node.get("children") or []
    for child in children:
        create_tree(child, current, variables, dry_run)


def main():
    parser = argparse.ArgumentParser(description="按模板批量创建文件夹并保留结构")
    parser.add_argument("template", help="JSON 模板文件路径")
    parser.add_argument("--project", help="项目名,对应 ${PROJECT_NAME}")
    parser.add_argument("--base-dir", default=".", help="创建根目录,默认当前目录")
    parser.add_argument("--dry-run", action="store_true", help="只输出计划,不实际创建")
    args = parser.parse_args()

    template = read_template(args.template)
    base_dir = Path(args.base_dir).resolve()

    if not base_dir.exists():
        raise SystemExit(f"base dir not exists: {base_dir}")

    variables = {
        "PROJECT_NAME": args.project or "untitled_project",
    }

    create_tree(template, base_dir, variables, dry_run=args.dry_run)

    if args.dry_run:
        print("dry run finished, no directory created.")


if __name__ == "__main__":
    main()

脚本的核心逻辑很容易读懂:read_template 读取 JSON 文件;render_name 用正则匹配 ${VAR} 并替换;create_tree 递归遍历,对每个节点先创建当前目录,再递归处理子节点。

这里有两个设计值得注意。

第一,current.mkdir(parents=True, exist_ok=True) 是保留结构的关键。parents=True 会创建路径中的所有父级目录,exist_ok=True 则让重复执行不会报错。整个脚本因此是幂等的,同一个项目名可以多次运行,不会崩溃。

第二,--dry-run 参数提供了安全网。它只打印计划创建的路径,不真正写磁盘。对任何涉及批量创建的操作,我都建议先跑一遍 dry run,确认路径没问题再真正执行。

5.3 变量替换:让模板真正可复用

目录名中的 ${PROJECT_NAME} 是模板字符串的一种常见写法。如果你愿意,也可以用 {{PROJECT_NAME}}、%(PROJECT_NAME)s,只要脚本和模板统一即可。这里选择 ${VAR} 是因为 bash 时代大家已经熟悉这种占位符风格,视觉上也不会和正则表达式混淆。

变量替换真正要注意的是替换顺序。假设你有一个目录叫 ${MODULE}-${PROJECT_NAME},脚本会在渲染目录名时一次性替换全部变量。如果你在文件名中也要替换,比如 application-${ENV}.yml,建议把变量表做成 dict,在同一个渲染函数里处理,避免某个变量先替换后改变后续匹配。

脚本目前只支持 ${PROJECT_NAME} 一种变量。你可以扩展 variables 字典,增加 MODULE_NAME、ENV、TEAM_NAME 等键,然后模板中写 ${MODULE_NAME} 即可。变量名格式建议统一为大写下划线风格,和 Linux 环境变量保持一致,降低阅读成本。

5.4 运行与验证

先在模板和脚本所在的测试目录执行 dry run:

bash复制python create_dirs.py project_template.json --project demo_project --dry-run

预期输出是一串 create: ... 路径,最后一行是 dry run finished。确认没有异常后去掉 --dry-run:

bash复制python create_dirs.py project_template.json --project demo_project

运行完成后,用 tree 命令验证结构:

bash复制tree demo_project

如果没有 tree 命令,Linux 可以使用 find demo_project -type d | sort,Windows 可以使用:

powershell复制Get-ChildItem -Recurse -Directory demo_project | Select-Object FullName

只要目录树和 JSON 模板一致,说明这次批量创建成功。这个方法的优势是模板文件可以被版本管理,脚本可以放进 CI 流程,团队里任何人创建新模块时都能得到相同结构。

6. 方法三:复制现有模板目录,完整保留结构

有时候模板不只是“目录骨架”,还包括初始化文件,比如 README.md、pom.xml、.gitignore、统一的配置样例。这类场景用 JSON 描述会非常费劲,因为你还得维护每个文件的内容。更直接的办法是:维护一个真实存在的模板目录,通过复制目录树来保留全部结构。

直接用文件管理器复制文件夹当然可以,但缺点是会带回不需要的历史文件、缓存、临时文件,而且项目名无法自动替换。更稳的做法是用 Python 的 shutil.copytree 做受控复制。

6.1 使用 shutil.copytree 复制目录树

新建脚本 copy_template.py:

python复制#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
复制模板目录,保留完整结构。

用法示例:
    python copy_template.py project_template my_project
"""
import argparse
import shutil
import sys
from pathlib import Path

DEFAULT_IGNORE = shutil.ignore_patterns(
    "__pycache__",
    "*.pyc",
    "*.pyo",
    ".git",
    ".DS_Store",
)


def main():
    parser = argparse.ArgumentParser(description="复制模板目录并保留结构")
    parser.add_argument("source", help="模板目录路径")
    parser.add_argument("target", help="目标目录路径")
    parser.add_argument("--ignore", help="额外的忽略模式,逗号分隔", default="")
    args = parser.parse_args()

    source = Path(args.source)
    target = Path(args.target)

    if not source.exists():
        raise SystemExit(f"template dir not exists: {source}")

    if target.exists():
        raise SystemExit(f"target already exists: {target}")

    extra_ignore = tuple(item.strip() for item in args.ignore.split(",") if item.strip())
    ignore_pattern = None

    if extra_ignore:
        ignore_pattern = shutil.ignore_patterns(*extra_ignore)
    else:
        ignore_pattern = DEFAULT_IGNORE

    try:
        shutil.copytree(
            source,
            target,
            ignore=ignore_pattern,
            dirs_exist_ok=False,
        )
        print(f"template copied: {source} -> {target}")
    except shutil.Error as exc:
        print("copy failed:")
        for message in exc.args if hasattr(exc, "args") else [exc]:
            print(" -", message)
        sys.exit(1)


if __name__ == "__main__":
    main()

这段代码的亮点在于安全边界:目标目录已存在时直接退出,避免覆盖现有文件。这比某些“先删除再复制”的做法安全得多,不会误删数据。shutil.ignore_patterns 用来排除模板中不需要拷贝到新项目的内容,例如 __pycache__、.git 等。

运行方式:

bash复制python copy_template.py project_template my_project

只有打印出 template copied: project_template -> my_project 才代表成功。复制后,my_project 的目录层级、文件结构、隐藏文件都与模板一致。

6.2 忽略规则与结构保留的权衡

忽略规则是个双刃剑。忽略得太少,会把缓存和本地配置复制进新项目;忽略得太多,可能把必要的初始化文件漏掉。我的建议是:模板目录里不要放缓存文件,模板本身要保持干净;.git 一定要忽略,否则会把模板的提交历史带进新项目。

如果模板目录里需要空目录,也需要谨慎。Git 本身不跟踪空目录,所以你的模板仓库里如果有空目录,一定要在每个空目录里放一个 .gitkeep 文件。这样模板被 Git 管理后空目录不会丢,复制到新项目时 .gitkeep 也一并保留,结构就完整了。

dirs_exist_ok=False 参数在 Python 3.8 及以上版本可用,用来明确禁止往已存在目录里复制内容。如果你的 Python 版本较低,需要在调用前手动检查 target.exists(),脚本里已经写了这个检查,所以逻辑是安全的。

6.3 复制模板文件并渲染占位符

复制目录解决的是“结构保留”,但很多情况下模板文件里也写死了项目名。复制完后还需要做一次内容渲染,把文件中的 {{PROJECT_NAME}} 替换成真实项目名。

可以写一个独立的渲染脚本,在复制完成后执行:

python复制#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
在目标目录中渲染模板文件的占位符。
用法示例:
    python render_files.py my_project --project demo_project
"""
import argparse
import re
from pathlib import Path

PLACEHOLDER_PATTERN = re.compile(r"\{\{(.*?)\}\}")


def render_path(source: Path, variables: dict):
    for target_file in source.rglob("*"):
        if not target_file.is_file():
            continue
        content = target_file.read_text(encoding="utf-8")
        new_content = PLACEHOLDER_PATTERN.sub(
            lambda m: variables.get(m.group(1).strip(), m.group(0)),
            content,
        )
        if new_content != content:
            target_file.write_text(new_content, encoding="utf-8")
            print("rendered:", target_file)


def main():
    parser = argparse.ArgumentParser(description="渲染模板文件占位符")
    parser.add_argument("target", help="渲染目录路径")
    parser.add_argument("--project", help="项目名,对应 {{PROJECT_NAME}}")
    args = parser.parse_args()

    target = Path(args.target)
    if not target.exists():
        raise SystemExit(f"target dir not exists: {target}")

    variables = {
        "PROJECT_NAME": args.project or "untitled_project",
    }

    render_path(target, variables)


if __name__ == "__main__":
    main()

这个脚本用 target.rglob("*") 递归扫描所有文件,遇到包含 {{PROJECT_NAME}} 的文件就替换并写回。注意它只替换文本文件,二进制文件用 read_text 可能出问题,建议模板目录里的二进制资源单独放置,不参与渲染。

完整的工作流是:先执行复制脚本,再执行渲染脚本:

bash复制python copy_template.py project_template my_project
python render_files.py my_project --project demo_project

这样既保留了模板目录的完整结构,又让项目名真正落到了文件内容里。

7. 三种方案对比与选型建议

三种方法没有绝对的优劣,适合的场景完全不同。可以看下面的对比表:

维度 Shell 大括号扩展 JSON + Python 递归 复制模板目录
结构描述 写在命令参数里 JSON 模板文件 基于现有目录树
目录层级复杂度 适合层级可控 适合任意层级 适合任意层级
变量替换 弱,需包函数处理 支持目录名和文件名 目录结构保留,内容需额外渲染
空目录保留 依赖命令写法 支持 支持,推荐配合 .gitkeep
文件权限保留 一般 一般 相对更好
是否适合版本管理 脚本可入库 模板和脚本都可入库 模板目录可直接入库
上手成本 最低 中等 低
推荐场景 一次性、临时、固定结构 团队长期复用、复杂树形结构 模板包含初始化文件、需要完整样板

如果你只需要临时在本地建几个固定目录,用 Shell 就够了。如果团队要统一规范,每次新建模块都生成同一棵树,推荐 JSON + Python,因为模板文件清晰、可评审、可复用。如果模板不仅包含目录,还包含 README、配置样例、CI 文件,那就用复制模板目录的方式,复制后渲染变量。

实际项目中,我见过很多团队用“JSON 模板 + 复制模板目录”结合的方式:基础目录树用 JSON 定义,作为骨架创建;初始化文件单独维护一个模板目录,用 copytree 复制。这样兼顾灵活性和可维护性。

8. 常见问题与排查思路

批量创建文件夹的脚本本身不难,但真正用起来,常见的坑集中在模板描述、编码、变量替换和目录已存在这几个方向。

问题现象 可能原因 排查方式 解决方案
JSON 模板解析失败 手写 JSON 时多了逗号或引号不对称 运行 python -m json.tool project_template.json 用工具校验模板,或用编辑器 JSON 格式化
创建的目录层级比预期多一层 根节点名称与 base-dir 重复 打印创建路径,对比模板结构 确认模板根节点不需要再加 base-dir
${PROJECT_NAME} 没有被替换 模板中写错占位符,例如少写了 $ 检查 name 字段原始值 统一用 ${VAR} 格式,并检查变量字典
目标目录已存在,无法复制 复用同一项目名导致目标冲突 检查 target 路径是否存在 不要覆盖,换新名称;必要时先移动旧目录备份
空目录在 Git 仓库中消失 Git 不跟踪空目录 查看模板仓库中的空目录 每个空目录放 .gitkeep 文件
文件内容中的项目名没有替换 只跑了复制脚本,忘了渲染脚本 打开复制后的文件查看占位符 执行渲染脚本,确认正则格式一致
中文目录名或内容乱码 终端编码与文件编码不一致 检查终端编码,检查文件的 encoding 参数 统一使用 UTF-8,脚本中显式写 encoding="utf-8"
Windows 下路径分隔符问题 脚本里混用了 / 和 \ 打印创建路径检查 使用 pathlib.Path 统一处理路径

这里的第一个问题最容易被新手忽略:JSON 模板是给人读的,但机器解析时非常严格,一个多余逗号就会让整个脚本停摆。每次修改模板后,先跑校验再执行创建,是最省时间的习惯。

还有一点需要特别提醒:不要在生产目录、数据目录上直接测试脚本。所有示例先在临时目录或测试目录跑通,再应用到真实项目。涉及批量创建目录的脚本,必须加 --dry-run 参数,先看计划再执行。

9. 最佳实践:把模板当成工程资产

批量创建文件夹的脚本很小,但它解决的是“规范落地”的问题。要让这套方案真正有价值,建议按工程资产的标准来管理它。

第一,模板要纳入版本管理。无论选 JSON 模板还是模板目录,都要放进 Git 仓库,和项目代码一起维护。目录规范一旦形成,就成为团队约定的一部分。每次调整目录结构,应该通过代码评审,而不是某个人默默改了一个文件夹。

第二,占位符格式要统一并在 README 中写清楚。目录名和文件名使用 ${VAR},文件内容使用 {{VAR}},这个约定要在模板注释或 README 中说明。如果不统一,团队成员理解成本会很高。

第三,运行前先做 dry run。可以把 --dry-run 作为默认提示,甚至在脚本里加一个交互确认:执行前打印将要创建的目录列表,输入 y 再真正创建。这种机制能有效防止手滑创建错误结构。

第四,空目录用 .gitkeep 占位。这不仅是复制模板目录的问题,也是任何模板仓库的问题。没有 .gitkeep 的空目录提交到 Git 后会消失,下次复制模板时就少了一个目录。

第五,避免用覆盖式方案。我强烈不建议用“先删除目标再复制”的方式来处理目录冲突,风险太大。更安全的做法是:先创建临时目录,确认无误后 rename。在同一个文件系统内,rename 是原子操作,不会出现复制到一半的中间状态。Python 中可以在临时目录里执行完创建或复制,最后通过 Path.rename 替换目标。

第六,脚本要支持参数校验。项目名如果包含空格、斜杠、特殊符号,目录创建可能出错或留下奇葩路径。建议在脚本里增加正则校验,例如只允许字母、数字、下划线、中划线:

python复制import re

def validate_project_name(name):
    if not re.fullmatch(r"[A-Za-z0-9_-]+", name):
        raise SystemExit(f"invalid project name: {name}")

第七,把脚本封装成交互式 CLI 是自然的下一步。你可以在此基础上增加多个模板选择、项目名提示、创建后输出 tree my_project 等能力。但不要为了“脚手架”而过度设计,批量创建文件夹的需求规模很小,保持脚本简单、透明、可靠,比做一个复杂工具更有价值。

第八,日志要可追溯。脚本打印的每一个 created 路径,既是运行记录,也是后续排错的依据。如果脚本要接入 CI 或自动化流程,建议把输出写进日志文件。

10. 总结

按模板批量创建文件夹并保留结构,这个需求听起来简单,做起来有几个很实际的分寸要把握好:模板描述要清晰,创建过程要可复用,变量替换要统一,空目录和隐藏文件不能丢,目标已存在时不能乱删。我用三种方案分别覆盖了不同复杂度:Shell 适合临时快速创建,JSON 加 Python 适合团队长期复用,复制模板目录适合需要完整初始文件的场景。

下一步建议你做三件事:第一,把文中的 Python 脚本拿下来,在自己的临时目录里跑通一次;第二,结合你的实际项目,定义一套目录模板,纳入 Git 仓库;第三,把 dry-run 变成使用习惯,再逐步把脚本扩展成交互式命令。这样,批量创建文件夹就不会是新项目开始时的意外事故,而是一次可控、可复验的规范执行。

内容推荐

安卓端侧大模型实战:从量化部署到本地AI聊天应用开发
端侧大模型 · 安卓本地AI · 模型量化
端侧智能正成为AI应用落地的重要方向,其核心在于将大语言模型部署到移动设备上,让推理完全在本地完成。与依赖云端接口的方案不同,本地推理通过模型量化技术压缩参数量,配合llama.cpp等推理框架在手机CPU上高效运行,从而实现在无网络环境下提供离线问答、文案生成等轻量服务。这一技术路径不仅保障了数据隐私,还降低了对服务器资源的依赖,适用于个人笔记辅助、企业内部信息整理等场景。本文以安卓本地AI聊天应用为例,系统梳理了模型选型、GGUF格式转换、JNI封装、流式输出与内存优化等关键环节,为开发者提供一份从模型部署到工程落地的完整实操参考。
安卓手机也能跑 Linux:Termux 搭建随身命令行环境
Termux · 安卓手机 · Linux环境
在移动办公与学习场景中,如何在没有电脑的情况下获得 Linux 命令行能力?答案就藏在安卓手机里。通过终端模拟器 Termux,用户无需 Root 或刷机,即可将手机改造为轻量级 Linux 环境,支持包管理器、Python/Node.js 运行、SSH 远程连接和脚本批量任务。这一方案不仅覆盖 linux 常用命令的练习需求,还能通过 proot-distro 安装 Ubuntu 等 linux 镜像,真正体验发行版安装流程。对于学生党、运维入门者而言,手机变身随身开发机,可随时敲命令、跑脚本、连服务器排障。文章从环境准备、安装部署、功能测试到性能优化,给出完整可复现的实践路径,帮助你快速上手这一低成本的移动 Linux 方案。
泰坦天降PC版自定义指令配置指南:从帧数到键位全面优化
自定义指令 · 配置文件 · 泰坦天降
PC游戏性能调优常常绕不开自定义指令与配置文件。游戏启动时通过固定顺序读取配置文本,将指令注入引擎环境变量,从而控制帧数上限、鼠标灵敏度与键位绑定等基础行为。理解这条原理,玩家可以不依赖第三方插件,仅用源码级参数实现个性化体验,并规避配置无效、完整性校验失败等常见风险。这类方法广泛适用于 Source 引擎及类似 PC 版本游戏,尤其适合需要精细调整画质与操作手感的射击类作品。泰坦天降系列 PC 版正是典型场景:善用启动参数、autoexec.cfg 与控制台命令,即可安全优化帧率、改善鼠标跟手度,并建立可备份、可回滚的配置管理习惯。
高敏感人群发展路径:用Notion与Streamlit搭建数字化成长系统
高敏感人群 · 个人知识管理 · 效率工具
在信息过载的当下,个人知识管理(PKM)与效率工具已成为知识工作者构建系统化成长路径的基础设施。其核心原理在于通过外部化记录、结构化分类与自动化流程,降低认知负荷,让注意力聚焦于高价值任务。此类技术不仅能提升任务完成率,还能为个体提供可量化的自我认知数据,尤其适合需要精细调节刺激与恢复节奏的敏感型人群。常见的应用场景包括任务管理、精力追踪、日志复盘与可视化看板。基于Notion、Obsidian及Streamlit等工具,可以搭建覆盖目标规划、执行记录与数据洞察的闭环系统。围绕高敏感人群的独特发展节奏,组合这些开源/低代码工具,即可构建一套可持续演进的个人发展管理系统。
PostgreSQL 从安装到调优:数据库部署与性能优化实战指南
PostgreSQL · 数据库安装 · pg_hba.conf
关系型数据库是现代应用的数据基石,PostgreSQL 凭借完善的事务、丰富的扩展和 JSON 支持,成为越来越多项目的默认选择。然而从部署到稳定运行,中间隔着认证配置、权限管理、备份恢复和慢查询定位等关键环节。本文从数据库基础概念与安装原理切入,覆盖 Windows、Linux、Docker 三大主流部署路线,深入讲解 pg_hba.conf 认证机制、用户权限最小化分配、pg_dump 备份恢复策略,以及用 EXPLAIN ANALYZE 分析执行计划、定位慢查询的实践方法。无论刚接触数据库的开发者,还是从 MySQL 迁移的工程师,都能从中建立一套从单机环境到生产落地的完整认知,让 PostgreSQL 真正成为可靠的数据底座。
封闭环境下设施摸排与线索留存:从巡检记录到独立备份的实操指南
设施摸排 · 线索留存 · 数据备份
在工程巡检与存量设施管理中,“无异常”结论往往不等于事实完整——档案断点、状态变更与历史图层缺失,会让一条真实线索被系统性地抹除。要识别这类问题,需理解数据记录与现场观测的分离原理:系统报告服务于流程结论,原始点位、样本与影像才是可追溯的底稿。通过历史图层比对、第三方检测、私人加密盘与纸质备份等方式,建立独立于正式流程之外的备份通道,可以有效对抗信息遮蔽。以下以一个工业走廊地下设施摸排案例,展示在封闭管理、复检与销号机制下,如何利用交叉验证和分通道保存策略,留下可重新开启的核查路径;这套方法也适用于城市更新中的档案交接与风险点位排查。
安卓手机运行Linux:从Termux到图形桌面的完整实践
Linux · Android · Termux
Linux作为开源操作系统的代表,其内核构成了Android系统的底层基础,但普通用户接触到的安卓应用生态与完整的Linux发行版环境仍有显著差异。理解这一差异,需要从系统架构切入:内核相同,用户态、文件系统与包管理机制却截然不同。利用终端模拟、容器或虚拟机技术,可以在移动设备上恢复一套可用的Linux环境,从而将旧手机转化为轻量级开发终端。这一方案适用于学习命令行操作、跑Python脚本、管理Git仓库或进行SSH远程运维。本文以Termux为主要载体,逐步演示安装、配置软件源、部署Python项目及启动VNC图形桌面的过程,帮助读者用最低成本搭建随身Linux实验室。
按模板批量创建文件夹:三种方案保留目录结构
批量创建文件夹 · 目录结构模板 · Python脚本
在工程实践中,目录结构是项目规范落地的基础,而批量创建文件夹则是初始化阶段最容易被忽视的环节。通过将目录树描述为可复用的模板,并用脚本自动生成多级结构,可以有效避免手工建目录带来的层级错位、命名不一致与空目录丢失等问题。模板化创建不仅支持占位符替换与变量渲染,还能保留空目录、隐藏文件及权限属性,让每次新建项目都得到完全一致的结果。这一思路广泛应用于模块化工程搭建、数据治理分层、文档体系初始化等场景,是提升团队协作效率与降低返工成本的实用工程手段。本文围绕模板化批量创建文件夹的核心需求,从Shell命令到JSON加Python递归,再到复制模板目录,给出了由浅入深的三种实现方案,帮助开发者根据实际场景选择最合适的做法。
计算机专业开学第一月:从环境初始化到周循环的工程实践
编程学习 · 开发环境 · 环境基线
软件开发与编程学习的第一步通常是搭建稳定的开发环境,而这一过程常被低估。环境基线的概念源于工程实践,指通过清单和脚本将工具链的版本、路径与依赖固定下来,从而降低未知错误的发生概率。其原理在于将“环境初始化”视为项目启动的必要环节,借助自检脚本、版本记录和变更日志让环境可复现、可追溯。对于计算机专业学生或自学者而言,建立这样的基线能显著减少排错时间,让注意力集中于知识本身。结合周循环与产出物管理,可将学习节奏转化为可验证的进度,避免陷入信息过载与“漫长感”。以环境清单、周报和排错链路构建稳定学习系统,正是高效学习的一套可操作工程化路径。
PostgreSQL 从零到生产:安装、配置、SQL实战与性能优化
PostgreSQL · 数据库安装 · 数据库配置
数据库选型与SQL能力是后端开发的核心技能。PostgreSQL作为高度兼容SQL标准的关系型数据库,其多进程架构、MVCC与WAL机制保证了高并发下的数据一致性与安全性。内置的JSONB、窗口函数与CTE等高级能力,为复杂查询和半结构化数据处理提供了高效方案,成为替代MySQL思维的重要选择。从Windows、Linux到Docker环境,从版本选择、psql连接、用户权限到核心配置,再到通过EXPLAIN ANALYZE和索引类型解决慢SQL问题,本文覆盖了一套完整的工程实践路径,并给出备份、监控与连接池等生产运维建议,帮助你在真实业务场景中稳定运行PostgreSQL。
装ima、存资料、连WorkBuddy:三步打造个人知识管理大脑
知识管理 · 个人知识库 · AI工作流
在信息过载的今天,零散收藏的资料难以转化为可调用的知识资产。个人知识库的核心在于建立从收集、沉淀到应用的完整链路:先通过工具统一收纳文档、网页与笔记,再借助AI解析与索引实现基于个人资料的精准问答,最后将知识对接至自动化任务流程,让AI基于真实材料辅助产出。这种“知识仓+任务中枢”的组合模式,尤其适合一人公司、自由职业者及高频内容创作者,能有效解决资料散落与重复劳动问题。ima与WorkBuddy正是这一流程中两个关键环节的落地工具——前者负责构建结构化知识仓库,后者负责将知识转化为可复用的工作模板,从而真正形成个人大脑的复利闭环。
从零实现可扩展的自定义指令框架:解析器、注册表与执行器设计
自定义指令系统 · 命令行工具 · 参数解析
在命令行工具、运维机器人与自动化平台的开发中,将用户输入的连续文本安全转换为可执行的方法调用,是贯穿所有交互系统的核心需求。理解这一过程的关键在于掌握指令注册、参数解析、类型转换与错误恢复的完整链路。基于Python标准库即可构建一个最小可运行的指令框架,通过shlex提供可靠的拆词能力,以数据模型驱动帮助生成与统一异常处理。该设计可平滑扩展至批量执行、远程协议接入与权限审计等生产场景,是构建高可维护性CLI与内部工具链的工程基础。本文以泰坦天降系列自定义指令指南为基础,梳理了从零实现一个可扩展指令系统的通用方法论,并给出可直接运行的代码示例与测试建议。
Android TV大屏海报墙开发实战:焦点处理与RecyclerView实现
Android TV · 海报墙 · RecyclerView
在智能电视普及的今天,遥控器交互与焦点机制成为电视应用体验的核心。不同于手机端的滑动操作,电视端依赖方向键移动焦点,如何高效展示影视内容成为开发者关注的重点。横向滚动、纵向分组的布局模式逐渐取代传统列表,成为大屏内容展示的主流方案。本文从Android TV开发视角出发,介绍基于RecyclerView与GridLayoutManager构建可聚焦、可滑动的海报墙,结合Glide解决大图加载与内存优化问题,并深入解析焦点搜索、边界跳转等关键细节。无论是追番应用、媒体中心还是桌面启动器,这套实现思路都能显著提升大屏浏览的沉浸感与操作效率。
安卓手机变身Linux学习机:Termux三条路线与实战指南
安卓手机 · Termux · Linux学习机
Linux系统学习常被绑定在电脑前的固定场景中,而移动终端与开源工具链的发展正逐渐打破这一限制。通过终端模拟器在Android设备上构建用户空间环境,用户可复用Linux内核能力与包管理机制,在不改变手机系统的前提下获得命令执行、脚本编写及服务部署能力。这种方案基于软件层面实现环境隔离,具有低成本、高便携的特点,适用于碎片化学习、轻量开发调试与远程维护等场景。从原理到实践,掌握环境配置、路径差异及性能边界,即可让手机成为随身的Linux练习场。本文以Termux为例,梳理三条主流实现路线的适用边界,并聚焦免root方案的最小跑通流程与常见问题排查,帮助读者快速建立起移动端Linux工作流。
安卓手机装App跑Linux环境:Termux与proot-distro实战指南
Termux · proot-distro · 安卓
Linux环境通常是开发者和运维人员的基础工具,但并非人人手边都有一台随时可用的电脑。安卓系统虽然基于Linux内核,却因为应用层采用Bionic libc等组件,无法直接运行标准的桌面发行版。借助Termux这类终端模拟工具,可以在手机(安卓设备)上构建一个轻量级Linux用户空间,支持包管理、脚本执行和常用开发工具;结合proot-distro,还能以非root方式进入完整的Ubuntu/Debian发行版,执行apt安装软件。这类方案在随身学习、远程SSH运维、轻量服务器调试等场景中具有实用价值。本文围绕Termux与proot-distro的环境搭建、换源、存储隔离与常见问题展开,帮助读者把手机变成一个真正可用的“口袋试验台”。
A2A协议核心:Agent Card读取、技能解析与认证核对实战指南
A2A协议 · Agent Card · 多智能体协作
多智能体协作的基础是服务发现与能力描述。Agent Card作为A2A(Agent2Agent)协议中声明Agent身份、技能与认证方式的标准入口,是Agent之间互相识别与调用的前提。它比传统OpenAPI更轻量,更偏向语义层描述,调用方通过读取Card即可判断目标Agent的能力边界、输入输出模式与安全要求。实际对接中,从取卡路径、解析skills技能列表到核对authentication认证方案,每一步都可能因协议版本或字段差异而踩坑。本文给出基于curl与Python的完整读卡流程,覆盖取卡、技能解析、认证核对与任务请求构建,帮助开发者在多智能体协同场景下快速落地A2A调用,降低Agent互联的集成成本。
把模糊需求转成系统模型:实体、生命周期与状态机设计实战
需求分析 · 领域建模 · 生命周期
在软件工程中,需求分析常面对模糊、自定义术语密集的描述,如何从中提炼实体、属性和规则,是领域建模与系统设计的核心能力。生命周期管理通过状态机描述对象在不同阶段的流转,事件驱动状态转移,确保业务规则可执行。这类建模方法广泛应用于游戏角色系统、多智能体身份管理、账号跨应用迁移等场景。本文以一套特殊文本为例,展示如何将高度抽象的概念转化为实体关系、生命周期状态机和事件接口,并给出可运行的代码示例,帮助技术人员掌握从叙事材料到工程实现的完整路径。
LangGraph多智能体实战:状态管理与条件路由编排复杂流程
LangGraph · 多智能体 · 流程编排
在大模型应用开发中,通过状态管理机制协调多个任务节点,是实现复杂业务流程编排的关键。LangGraph作为LangChain生态中的流程编排框架,利用图结构将节点、边与共享状态结合,使多智能体协作变得可视化、可控且可恢复。基于条件路由,系统可根据任务内容动态选择执行路径,有效解决单智能体在职责混乱、上下文膨胀等方面的局限。在实际工程中,无论是构建任务调度系统、知识库问答,还是实现人工审批与并行执行,LangGraph都提供了灵活的技术底座。本文以一个三智能体协作系统为例,演示基于LangGraph的多智能体实现方式。
2027版一天学会MySQL 8:从安装到索引优化与事务备份全攻略
MySQL 8 · MySQL安装 · SQL优化
数据库是后端开发与数据分析的基石,而MySQL作为全球使用最广泛的开源关系型数据库,其8.x版本在稳定性、性能与功能上都实现了质的飞跃。从安装部署到SQL查询,从索引优化到事务管理,掌握MySQL 8的核心技能不仅能解决日常开发中的存储难题,更能提升系统性能与数据安全性。本文围绕MySQL 8.4 LTS版本,以可直接复用的命令和代码,系统拆解环境配置、建库建表、窗口函数、执行计划分析、高并发事务处理及常见故障排查等关键环节,帮助你在真实业务场景中快速上手并构建一套长期可用的数据库学习与排错方法论。
Python批量创建文件夹:基于模板自动生成目录结构
Python · 批量创建文件夹 · 模板
在项目初始化、资料归档和测试用例准备等日常开发场景中,手工创建数十个层级嵌套的文件夹不仅效率低下,还容易因人为失误导致目录结构不一致。自动化批量创建文件夹的核心思路,是将目录层级抽象为可复用的模板文件,通过脚本解析并调用系统接口生成完整结构。Python标准库中的pathlib与mkdir方法为这一实现提供了跨平台支持,配合缩进解析和占位符替换,能够将重复性操作沉淀为可靠的工程工具。这种“模板+脚本”的模式,适用于课程资料归档、项目脚手架搭建、测试用例目录准备等各类需要快速复制固定目录结构的场景。本文从模板设计、路径解析、安全校验到运行排查,系统拆解了一套基于Python脚本的批量文件夹生成方案,帮助开发团队提升目录搭建效率并保证结构一致性。
已经到底了哦
精选内容
热门内容
最新内容
Code Map实战:用代码可视化理清调用链,降低读代码成本
面对陌生代码仓库,逐行翻阅文件往往让人迷失在调用链中,难以建立全局感知。代码可视化工具通过静态分析源码结构,将模块关系、依赖关系和调用路径转化为可一眼扫完的地图,帮助开发者先看全局、再定入口,显著提升上手效率。其核心价值不在于画出一张漂亮的架构图,而在于把理解代码从依赖经验的个人行为,转变为可控的工程流程:先识别模块边界与核心节点,再沿调用链追踪关键路径,最后回到代码验证细节。这类工具尤其适合新人接手老项目、重构前评估影响面,以及团队沟通架构设计;但需注意静态图无法反映运行时动态行为,排查线上问题仍需借助链路追踪与日志。通过固定版本、固化生成命令、定期重生成图,将代码可视化融入日常工作流,才能真正降低读代码成本,让架构理解变得可讨论、可复用。
PostgreSQL进阶实战:从安装到窗口函数与性能优化
关系型数据库在数据架构中始终扮演核心角色,而PostgreSQL凭借其强大的扩展能力、完整的SQL标准支持以及丰富的插件生态,正成为越来越多开发团队的首选。它通过MVCC实现高并发读写,利用WAL机制保障数据持久性,并结合窗口函数、CTE、JSONB、索引优化等高级特性,让复杂业务分析与查询变得高效而优雅。无论是本地开发环境用Docker快速部署,还是生产环境基于Linux包管理器或源码编译安装,都能以灵活方式落地。对于从MySQL迁入的工程师或希望深入数据库能力的开发者,掌握PG的索引机制、执行计划分析与参数调优,能够显著提升系统性能与稳定性。本文围绕PostgreSQL选型、安装、高阶SQL、慢查询排查与工程化实践,系统梳理一条完整的学习与落地路径。
Code Map实战:用代码可视化快速生成项目依赖地图
面对大型软件项目,理解模块间的调用关系是高效阅读代码的关键。通过抽象语法树(AST)解析源码,可以将文件依赖、函数调用转换为结构化的依赖关系图。这类代码可视化技术不需要运行业务代码,仅靠静态分析就能生成清晰的模块地图,帮助开发者识别核心服务、边缘模块乃至循环依赖风险。在新成员加入、代码评审或架构治理等场景中,依赖图能显著提升沟通效率,也能作为文档沉淀。本文围绕轻量代码可视化工具Code Map,从环境准备、核心原理到完整实战,演示如何利用AST、Graphviz等基础组件构建一个可复用的代码地图工具。
MySQL进阶实战:从执行链路到索引优化与事务并发
在数据库技术体系中,MySQL 是后端开发的核心基石。理解一条 SQL 从解析到返回的完整执行链路,是掌握其底层原理的关键。索引优化则决定了查询性能的上限,通过 EXPLAIN 分析执行计划、合理设计联合索引,可以有效避免慢查询。事务与锁机制保障了并发场景下的数据一致性,MVCC 让读写互不阻塞。这些技术在实际业务中广泛应用于电商订单查询、报表统计、高并发写入等场景。掌握备份恢复与日志机制,更是生产环境数据安全的最后防线。本文以实战案例为主线,系统梳理了 MySQL 从环境搭建、表结构设计到性能调优与故障排查的完整路径,适合后端开发者和进阶学习者参照实践。
FDE智能数据库底座:从AI Agent到企业级数据治理实战解析
数据库开发正在从手工SQL编写走向智能化、自动化。AI Agent 技术的成熟,使得自然语言生成查询、自动优化执行计划成为可能,但要将这种能力落地到生产环境,还需要解决权限管控、审计回滚、成本控制等企业级问题。FDE(智能数据库引擎)正是将语义理解、规划执行、治理审计与AI Agent深度融合的底座型工具,它改变了从业务问题到数据结果的整条协作链路,让数据平台建设者能够构建可治理、可观测、可回滚的智能数据服务。无论是数据中台改造,还是业务系统智能化升级,理解FDE的架构与最佳实践,都成为眼下数据工程领域的重要方向。本文从核心概念出发,拆解FDE的部署、流程与生产落地要点,帮助工程师快速建立可执行的实践地图。
Revit 2026与AutoCAD 2026协同:BIM工作流与参数化建模实战
BIM技术正推动建筑设计从传统“画图”向“模型驱动出图”转型,其核心原理在于将几何信息与属性数据绑定,使平面、立面、剖面视图同步更新,从根源上解决CAD时代多图不一致的返工痛点。从工程实践看,BIM的价值不仅体现在三维可视化,更在于信息的一致性与可追溯性,尤其适合教堂等异形复杂项目。面对这类造型多变的建筑,单纯建模容易陷入“三维好看、二维混乱”的困境。本文以Revit 2026与AutoCAD 2026为工具,系统梳理从参数化组件设计到施工图深化的完整协同工作流:Revit负责搭建带属性的信息模型,AutoCAD承接局部节点与二维表达,并通过图层映射、DWG导出实现无缝交付。这套协作框架可灵活复用于住宅、办公楼等常规项目,帮助设计团队真正减少协调成本、提升出图效率。
泰坦天降系列自定义指令指南:启动参数与配置文件详解
在PC游戏中,启动参数与配置文件是实现个性化操作体验与性能调优的通用技术手段。通过修改游戏启动选项、自定义按键绑定与画面参数,玩家可以在官方允许范围内优化运行效率,并解决分辨率适配、键位冲突等常见问题。这类技术不仅适用于特定作品,也是版本管理、配置分发和故障排查的工程基础。泰坦天降系列的自定义指令体系,将启动参数、配置文件与控制台指令打通,帮助玩家在多平台版本间统一设置,并通过批处理脚本实现多机分发。掌握其原理,既能提升单机与私人服务器的实验效率,也能建立备份、回滚与验证的规范化流程。本文以该系列为例,梳理从环境准备到指令生效验证的完整路径,为玩家提供一套可复用的自定义配置方法论。
Windows 原生跑 Linux 容器:WSL 2 + Docker Desktop 完整实战指南
在 Windows 上运行 Linux 容器,传统依赖虚拟机的方式笨重且低效。WSL 2 通过轻量级虚拟机提供真实 Linux 内核,Docker Desktop 将引擎无缝接入该内核,让容器体验接近原生 Linux。本文从环境准备出发,涵盖虚拟化检查、WSL 2 启用、Docker 部署、端口映射、目录挂载、Compose 编排、API 调用与批量任务管理,并针对资源占用、性能优化和常见故障给出实用排查方法。面向本地中间件调试、环境一致性与容器学习等场景,为开发者提供一套低成本、可复现的 Windows 容器化工作流。
批量复制文件夹并重命名:Windows批处理/PowerShell/Python/Shell全方案
文件目录的重复操作是日常开发与运维中最常见的效率瓶颈之一。无论是批量重命名文件,还是从一个模板目录复制出多个实例,核心思路都是将手动操作抽象为自动化脚本。通过循环生成目标名称并调用复制命令,可以在数秒内完成数十个目录的创建与命名。Windows 下可使用批处理或 PowerShell,Linux 下可利用 shell 脚本与 rename 命令,而 Python 则提供了跨平台的统一解决方案。这类技术广泛应用在项目初始化、测试数据准备、备份归档及 CI/CD 流水线等场景。本文从基础概念与命令原理出发,对比四类脚本实现,并给出项目工程中的安全注意点与扩展技巧,帮助读者快速搭建自己的批量目录处理工具。
Android端本地AI聊天App实现:端侧推理与离线部署全攻略
随着端侧AI技术的兴起,在手机等移动设备上直接运行大语言模型已成为现实。理解端侧推理的原理是关键,它通常依赖于量化后的小尺寸开源模型(如0.5B~3B参数的GGUF格式文件),配合llama.cpp等轻量级推理框架,在无需联网和云端服务器的情况下,完成对话生成、上下文理解等任务。这种方案的技术价值在于数据隐私安全、离线可用和极低的部署成本,非常适合个人隐私助手、内网知识问答、边缘端自动化文本处理等应用场景。本文以完整实现一个Android本地AI聊天应用为例,从模型选型、环境准备到API封装与批量任务运行,详细拆解端侧LLM部署的全流程工程实践。
已经到底了哦