Home
img of docs

根据文件所在目录更改文件中的内容

chou403

/ Tool

/ c:

/ u:

/ 3 min read


一学一个不吱声

为了实现这个需求,你可以使用 Node.js 脚本来遍历 src 目录下的所有文件,并将每个文件中的 category 数据替换为文件所在的目录名称。以下是一个示例脚本:

   import * as fs from "fs";
import * as path from "path";

// 遍历目录并处理文件
function traverseDirectory(dir: string) {
	fs.readdirSync(dir).forEach((file) => {
		const filePath = path.join(dir, file);
		const stat = fs.statSync(filePath);

		if (stat.isDirectory()) {
			traverseDirectory(filePath);
		} else if (stat.isFile() && filePath.endsWith(".mdx")) {
			processFile(filePath, path.basename(dir));
		}
	});
}

// 处理单个文件
function processFile(filePath: string, directoryName: string) {
	let content = fs.readFileSync(filePath, "utf-8");
	const regex = /category\s*:\s*(\S+)/;
	const match = content.match(regex);

	if (match) {
		content = content.replace(match[0], `category: ${directoryName}`);
		fs.writeFileSync(filePath, content, "utf-8");
		console.log(`Updated ${filePath}`);
	} else {
		console.log(`No category found in ${filePath}`);
	}
}

// 从 src 目录开始遍历
const srcDir = path.join(__dirname, "src");
traverseDirectory(srcDir);

说明

  1. 遍历目录: traverseDirectory 函数递归地遍历 src 目录下的所有文件和子目录。
  2. 处理文件: processFile 函数读取文件内容,查找 category 字段,并将其替换为文件所在目录的名称。
  3. 正则表达式: 使用正则表达式 /category\s*:\s*(\S+)/ 来匹配 category 字段及其值。
  4. 写回文件: 将修改后的内容写回文件,并在控制台输出更新信息。

运行脚本

  1. 将上述脚本保存为 updateCategories.ts
  2. 使用 TypeScript 编译器编译脚本:
       tsc updateCategories.ts
  3. 运行编译后的 JavaScript 文件:
       node updateCategories.js

这样,脚本会遍历 src 目录下的所有 .mdx 文件,并将每个文件中的 category 数据替换为文件所在的目录名称。

目前已将上述操作移动到 py 执行,调整为只修改以---开始,以---结尾的内容。

   import os
import re

def replace_category_from_dir_name(text, directory_name):
    # 使用正则表达式匹配 --- 开始和 --- 结束之间的内容
    pattern = re.compile(r'---\n(.*?)\n---', re.DOTALL | re.MULTILINE)

    def replace_match(match):
        # 在匹配的内容中进行替换
        content = match.group(1)
        replaced_content = re.sub(r'category\s*:\s*\S+', f'category: {directory_name}', content)
        return f'---\n{replaced_content}\n---'

    # 替换所有匹配的内容
    return pattern.sub(replace_match, text)