node.js实现遍历所有文件夹里面的js文件,提取所有的url

简介: node.js实现遍历所有文件夹里面的js文件,提取所有的url
  fs模块是File System(文件系统)的缩写,它提供了一系列API用于与文件系统进行交互。你可以使用这些API来读取文件、写入文件、更改文件权限、监视文件变化等。

    path模块提供了一些实用工具函数,用于处理文件和目录的路径。这些函数可以简化路径的拼接、分解、格式化和转换等工作。

    readline模块用于逐行读取文件内容或来自其他可读流(如标准输入)的数据。这对于处理大型文件或需要与用户进行交互式文本输入的场景非常有用。

// 准备工作,引入需要的api
const fs = require('fs');
const path = require('path');
const readline = require('readline');
因为文件夹里面可能会存在多个文件夹或者多个文件,需要我们通过递归去遍历文件夹里面的文件

    定义文件路径

// 指定要遍历的起始文件夹路径
const startDirPath = 'xxx';
// 输出文件路径,最好是采用绝对路径
const outputFilePath = 'xxx';
清空写入的文件的内容

// 使用fs.truncate清空文件内容
fs.truncate(outputFilePath, 0, () => {});
递归遍历文件内容并写入文件

traverseDirectory(startDirPath);

// 递归遍历文件夹的函数
function traverseDirectory(dirPath) {

fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {  
    if (err) {  
        console.error(`Error reading directory ${dirPath}: ${err}`);  
        return;  
    }  
    files.forEach(file => {  
        const fullPath = path.join(dirPath, file.name);  

        if (file.isDirectory() && file.name !== 'node_modules') {  
            traverseDirectory(fullPath); // 递归遍历  
        } else if (file.isFile() && path.extname(file.name).toLowerCase() === '.js') {  
            // 读取JS文件  
            const rl = readline.createInterface({  
                input: fs.createReadStream(fullPath),  
                crlfDelay: Infinity  
            });  

            let matchedLines = [];  

            rl.on('line', (line) => {  
                // 使用正则表达式找到所有被引号包裹的字符串  
                const quoteRegex = /(['"])\/([\/\w]+)\1/g;
                let match;  

                while ((match = quoteRegex.exec(line)) !== null) { 
                    matchedLines.includes(match[0]) ? null : matchedLines.push(match[0]);  
                }  
            });  

            rl.on('close', () => {  
                // 将所有匹配的字符串写入输出文件  
                if (matchedLines.length > 0) { 
                    fs.appendFile(outputFilePath, matchedLines.join('\n') + '\n', (err) => {  
                        if (err) {  
                            console.error(`Error writing to ${outputFilePath}: ${err}`);  
                        } else {  
                          console.log(outputFilePath, 'outputFilePath')
                            console.log(`Processed file: ${fullPath}, ${matchedLines.length} matches found.`);  
                        }  
                    });  
                }  
            });  
        }  
    });  
});  

}

    可能由于我们的正则匹配格式并没有很严谨,或者说我们只需要某些特定的数据,这个时候,我们可以对获取到的数据进行移除特定词的过滤。

// 关键词列表
const keywords = ['submit', 'add', 'update', 'save', 'confirm', 'faq', 'cn', 'page', 'list', 'send', 'join', 'modelInventory', 'mem', 'mcom', 'trade', 'order', 'corporateProcurement',
'enterprisePay', 'delete', 'cancel', 'del', 'check', 'upload'];

// 检查字符串是否包含任何关键词(不区分大小写)
function containsKeyword(str) {
return keywords.some(keyword => str && str.toLowerCase().includes(keyword));
}

// 在写入文件之前进行判断
while ((match = quoteRegex.exec(line)) !== null) {
const quotedString = match[2];
if (containsKeyword(quotedString)) {
// 如果引号内的内容包含关键词,则记录整个匹配的字符串
matchedLines.includes(match[0]) ? null : matchedLines.push(match[0]);
}
}

    如果您想对获取到的数据进行排序或者做一些其他的操作,可以将输入传给外面的变量

let resultList = [];

rl.on('close', () => {
// 将所有匹配的字符串写入输出文件
if (matchedLines.length > 0) {
resultList = [...resultList, ...matchedLines];
console.log(outputFilePath, 'outputFilePath')
console.log(Processed file: ${fullPath}, ${matchedLines.length} matches found.);
}
});
总结代码
const fs = require('fs');
const path = require('path');
const readline = require('readline');

// 关键词列表
const keywords = ['submit', 'add', 'update', 'save', 'confirm', 'faq', 'cn', 'page', 'list', 'send', 'join', 'modelInventory', 'mem', 'mcom', 'trade', 'order', 'corporateProcurement',
'enterprisePay', 'delete', 'cancel', 'del', 'check', 'upload'];
// 指定要遍历的起始文件夹路径
const startDirPath = 'D:\projects\ecm\html\front'; // 替换为你的文件夹路径
// 输出文件路径
const outputFilePath = 'C:\Users\cheney_chen\Desktop\中文站接口url.txt';

let resultList = [];

// 检查字符串是否包含任何关键词(不区分大小写)
function containsKeyword(str) {
return keywords.some(keyword => str && str.toLowerCase().includes(keyword));
}

// 递归遍历文件夹的函数
function traverseDirectory(dirPath) {
fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {
if (err) {
console.error(Error reading directory ${dirPath}: ${err});
return;
}
files.forEach(file => {
const fullPath = path.join(dirPath, file.name);
if (file.isDirectory() && file.name !== 'node_modules') {
traverseDirectory(fullPath); // 递归遍历
} else if (file.isFile() && path.extname(file.name).toLowerCase() === '.js') {
// 读取JS文件
const rl = readline.createInterface({
input: fs.createReadStream(fullPath),
crlfDelay: Infinity
});
let matchedLines = [];
rl.on('line', (line) => {
// 使用正则表达式找到所有被引号包裹的字符串
const quoteRegex = /(['"])\/([\/\w]+)\1/g;
let match;

                while ((match = quoteRegex.exec(line)) !== null) { 
                    const quotedString = match[2];  
                    if (containsKeyword(quotedString)) {  
                        // 如果引号内的内容包含关键词,则记录整个匹配的字符串
                        matchedLines.includes(match[0]) ? null : matchedLines.push(match[0]);  
                    }  
                }  
            });  

            rl.on('close', () => {  
                // 将所有匹配的字符串写入输出文件  
                if (matchedLines.length > 0) { 
                  resultList = [...resultList, ...matchedLines];
                  console.log(outputFilePath, 'outputFilePath')
                  console.log(`Processed file: ${fullPath}, ${matchedLines.length} matches found.`);  
                } 
            });  
        }  
    });  
});  

}

// 使用fs.truncate清空文件内容
fs.truncate(outputFilePath, 0, () => {});
traverseDirectory(startDirPath);

setTimeout(()=>{
resultList = [...new Set(resultList)];
resultList = resultList.map((item, index) => (index + 1) + '、' + item)
// 写入文件
fs.appendFile(outputFilePath, resultList.join('\n') + '\n', (err) => {
if (err) {
console.error(Error writing to ${outputFilePath}: ${err});
}
});
}, 5000)

相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
2月前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
47 0
|
18天前
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
46 9
|
1月前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
44 1
|
1月前
|
开发框架 JavaScript 前端开发
Node.js日记:客户端和服务端介绍、Node.js介绍
Node.js日记:客户端和服务端介绍、Node.js介绍
|
1月前
|
JavaScript 前端开发 开发工具
Node.js——初识Node.js
Node.js——初识Node.js
34 4
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
41 4
|
2月前
|
存储 开发框架 JavaScript
Node.js实现短链接(ShortLink):shortid、epxress让URL更简单
Node.js实现短链接(ShortLink):shortid、epxress让URL更简单
82 0
Node.js实现短链接(ShortLink):shortid、epxress让URL更简单
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
混淆指定js文件
【9月更文挑战第26天】JavaScript 混淆旨在保护代码知识产权、减小文件体积和提高安全性。方法包括变量名和函数名混淆、代码压缩、控制流平坦化及字符串加密。常用工具如 UglifyJS 和 JScrambler 可实现这些功能。然而,混淆可能带来兼容性和调试困难等问题,需谨慎使用并确保法律合规。
|
2月前
|
缓存 监控 JavaScript
Node.js中基于node-schedule实现定时任务之详解
Node.js中基于node-schedule实现定时任务之详解
110 0