30行代码实现合并指定目录下的所有文件的内容

简介: 30行代码实现合并指定目录下的所有文件的内容

背景


临近毕业,肝完论文,指导老师叫把所有所有所有的源代码放附录


感到无语(它是不知道前端代码有好多),又无法拒绝


这么多文件,手动CV是不可能手动CV的,咱给它整个脚本,把内容合并到一个文件去,直接插入word


准备工作


装个Node环境即可



目标


执行一行如下指令,就搞定目标目录的文件合并


node index.js <target_directory>


开工


获取指令传参


使用process模块,argv属性上表明了所有的参数


const process = require('process')
// 传入的目录
const targetDir = process.argv[2]
console.log(process.argv)


测试结果


node index.js /home/sugar/Documents/VueProject
# 打印结果
[
  '/home/sugar/.nvm/versions/node/v16.0.0/bin/node',
  '/home/sugar/Documents/VueProject/my-blog-vuepress/docs/technology/works/index.js',
  '/home/sugar/Documents/VueProject'
]


获取指定目录下的所有文件


思路


咱使用path,fs模块结合递归搞定:

  1. readdirSync方法获取所有的文件(包含目录)
  2. 通过isFile判断是否是文件
  3. 使用path.join拼接路径


具体实现如下


const path = require('path')
const fs = require('fs')
/**
 * 递归获取指定目录中的所有文件的绝对路径路径
 * @param {string} dir 目标目录
 * @param {string[]} 
 * @returns {string[]} 文件绝对路径数组
 */
function getDirFiles(dir) {
    let result = []
    let files = fs.readdirSync(dir, { withFileTypes: true })
    files.forEach(file => {
        const filepath = path.join(dir, file.name)
        if (file.isFile()) {
            result.push(filepath)
        } else if (file.isDirectory()) {
            result.push(...getDirFiles(filepath))
        }
    })
    return result;
}


测试


console.log(getDirFiles('/home/sugar/Documents/VueProject/my-blog-vuepress/docs'));


打印结果,能获取到所有的文件的绝对路径


[
  '/home/sugar/Documents/VueProject/my-blog-vuepress/docs/.vuepress/comment.js',
  '/home/sugar/Documents/VueProject/my-blog-vuepress/docs/.vuepress/components/LeetCode.vue',
  ... 237 more items
]


结果中会出现.git,node_modules中的内容,咱加个过滤逻辑:


  • 使用数组存放,需要排出的目录或文件的相对路径
  • 使用endsWith方法进行匹配
  • Array.some方法遍历,符合条件则排除


/**
 * 递归获取指定目录中的所有文件的绝对路径路径
 * @param {string} dir 目标目录
 * @param {string[]} 
 * @returns {string[]} 文件绝对路径数组
 */
function getDirFiles(dir, exclude = []) {
    let result = []
    let files = fs.readdirSync(dir, { withFileTypes: true })
    files.forEach(file => {
        const filepath = path.join(dir, file.name)
        const isExclude = exclude.some(v => {
            return filepath.endsWith(v)
        })
        if (!isExclude) {
            if (file.isFile()) {
                result.push(filepath)
            } else if (file.isDirectory()) {
                result.push(...getDirFiles(filepath, exclude))
            }
        }
    })
    return result;
}


合并文件目标文件的内容


思路:

  • 通过readFileSync读取指定文件的内容
  • 使用appendFileSync方法向目标文件追加内容
  • 使用Date.now生成时间戳,作为目标文件名


具体实现如下


/**
 * 内容并入一个文件中
 * @param {string[]} files 
 */
function mergeFile(files) {
    // 写入的目标文件(时间戳命名)
    const writeFilepath = path.join(__dirname, `${Date.now()}.txt`)
    files.forEach(f => {
        // 文件中的内容
        const txt = fs.readFileSync(f, { encoding: 'utf-8' })
        // 文件的相对路径(注意,这个targetDir是外部变量表示这些文件的公共目录,此行代码主要为获取文件的相对路径)
        const dir = f.slice(targetDir.length + 1)
        // 追加内容的方式
        fs.appendFileSync(writeFilepath, `${dir}\n`)
        fs.appendFileSync(writeFilepath, `${txt}\n\n`)
    })
    console.log('ok', files.length, '个文件');
    console.log(files);
}


测试


以我当前的项目为例子


node index.js /home/sugar/Documents/VueProject/my-blog-vuepress


结果


ok 309 个文件


网络异常,图片无法展示
|


好家伙,敲了3w多行了


完整代码


const process = require('process')
const path = require('path')
const fs = require('fs')
// 传入的目录
const targetDir = process.argv[2]
// 忽略的内容
const ignore = ['node_modules', '.git', 'dist',
 'ignore', 'README.md', '.lock', '.png','docs','.eslintrc.js',
 '.env','LICENSE','tsconfig.json','.github','_tests_']
const files = getDirFiles(targetDir, ignore)
mergeFile(files)
/**
 * 内容并入一个文件中
 * @param {string[]} files 
 */
function mergeFile(files) {
    // 写入的目标文件(时间戳命名)
    const writeFilepath = path.join(__dirname, `${Date.now()}.txt`)
    files.forEach(f => {
        // 文件中的内容
        const txt = fs.readFileSync(f, { encoding: 'utf-8' })
        // 文件的相对路径
        const dir = f.slice(targetDir.length + 1)
        // 追加内容的方式
        fs.appendFileSync(writeFilepath, `${dir}\n`)
        fs.appendFileSync(writeFilepath, `${txt}\n\n`)
    })
    console.log('ok', files.length, '个文件');
    console.log(files);
}
/**
 * 递归获取指定目录中的所有文件的绝对路径路径
 * @param {string} dir 目标目录
 * @param {string[]} 
 * @returns {string[]} 文件绝对路径数组
 */
function getDirFiles(dir, exclude = []) {
    let result = []
    let files = fs.readdirSync(dir, { withFileTypes: true })
    files.forEach(file => {
        const filepath = path.join(dir, file.name)
        const isExclude = exclude.some(v => {
            return filepath.endsWith(v)
        })
        if (!isExclude) {
            if (file.isFile()) {
                result.push(filepath)
            } else if (file.isDirectory()) {
                result.push(...getDirFiles(filepath, exclude))
            }
        }
    })
    return result;
}


相关文章
|
资源调度 前端开发
React npm i @ant-design/ --save无法导入问题
React npm i @ant-design/ --save无法导入问题
300 0
|
jenkins 测试技术 持续交付
软件测试:基础概念
软件测试:基础概念
272 0
|
存储 前端开发 JavaScript
纯前端实现腾讯cos文件上传功能
在前端开发中文件上传是经常会遇到的,并且多数情况会使用第三方平台来存储文件,腾讯云cos是我们常用的。本篇文章就是带我从前端的角度实现腾讯云COS存储。本文参考了腾讯云COS开发文档 JavaScript SDK
1475 0
|
数据采集 存储 Web App开发
利用Puppeteer-Har记录与分析网页抓取中的性能数据
在现代网页抓取中,性能数据的记录与分析至关重要。本文介绍如何使用Puppeteer-Har工具记录和分析抓取过程中的性能数据。Puppeteer-Har结合了Puppeteer和Har的优势,简化了性能数据分析流程。首先确保已安装Node.js和npm,并通过`npm install puppeteer puppeteer-har`安装所需库。为了规避IP限制,本文还介绍了如何配置代理IP。最后,通过一个完整示例展示了如何使用Puppeteer-Har抓取今日头条的性能数据,并对生成的HAR文件进行解析和存储。希望本文能为您的网页抓取工作提供帮助。
263 1
利用Puppeteer-Har记录与分析网页抓取中的性能数据
|
物联网 Linux C#
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
微软的开源跨平台框架 Uno Platform 支持使用 C# 和 XAML 一次性编写代码并部署至多个平台,如 Windows、macOS、Linux、WebAssembly 及 iOS/Android,这使其成为 IoT 设备开发的理想选择。本文通过创建控制网络 LED 灯的应用,详细介绍了 Uno Platform 的环境搭建及 MQTT 客户端配置过程,实现了 LED 状态订阅与控制指令发送功能。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
708 58
|
安全 关系型数据库 MySQL
揭秘MySQL海量数据迁移终极秘籍:从逻辑备份到物理复制,解锁大数据迁移的高效与安全之道
【8月更文挑战第2天】MySQL数据量很大的数据库迁移最优方案
1421 17
|
自然语言处理 安全 Shell
【Python】已解决:Python pip正确安装pyhanlp库步骤
【Python】已解决:Python pip正确安装pyhanlp库步骤
622 2
|
缓存 应用服务中间件 区块链
PbootCms上传图片变模糊、上传图片尺寸受限的解决方案
PbootCms上传图片变模糊、上传图片尺寸受限的解决方案
|
API 开发者 Python
Zohomail邮箱API发送邮件的方法
Zohomail提供RESTful API用于发送邮件,可通过HTTP请求集成到应用中实现自动化。要使用API,需获取访问权限,包括API密钥和访问令牌。发送邮件涉及构建HTTP POST请求、发送请求及处理响应。示例代码展示了Python发送邮件的过程。AokSend支持高效邮件发送服务,包括SMTP/API接口和触发式接口。
敏捷开发:拥抱变化,快速迭代
在软件开发领域,敏捷开发已成为应对快速变化、提升交付效率的有效方法。它强调团队协作、客户反馈和灵活应变,核心价值观包括个体互动优先于流程工具、可工作软件优先于详尽文档、客户合作优先于合同谈判、响应变化优先于遵循计划。敏捷开发通过跨功能团队、短周期迭代、持续改进和客户紧密合作等实践,实现高效开发和创新。虽然面临抵抗变化、管理期望等挑战,但敏捷思维能显著提升团队表现和产品品质。