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)

相关文章
|
11天前
|
JavaScript API
深入探索fs.WriteStream:Node.js文件写入流的全面解析
深入探索fs.WriteStream:Node.js文件写入流的全面解析
|
2天前
|
JavaScript
Node.js之文件夹的操作
Node.js之文件夹的操作
19 9
|
17天前
|
JSON JavaScript 前端开发
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
|
20天前
|
缓存 JavaScript 前端开发
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
这篇文章介绍了如何解决npm版本与Node.js版本不兼容的问题,提供了查看当前npm和Node.js版本的步骤,以及如何根据Node.js版本选择合适的npm版本并进行升级的详细指导。
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
|
20天前
|
JavaScript 数据安全/隐私保护
如何在Vue组件中调用封装好的外部js文件方法
这篇文章介绍了如何在Vue组件中调用封装好的外部js文件方法,包括在Vue项目中全局引入外部js文件,并在组件中通过this.$myMethod()的方式调用外部js文件中定义的方法。
如何在Vue组件中调用封装好的外部js文件方法
|
8天前
|
JavaScript 前端开发 API
全栈开发革命来临!Vue.js与Node.js联手,打造前后端无缝对接的奇迹之作!
【8月更文挑战第30天】在Web开发领域,前后端分离与协作至关重要。Vue.js以其轻量级和易用性深受前端开发者喜爱,而Node.js则以高性能和事件驱动特性在后端领域崭露头角。二者结合开启了全栈开发新篇章,通过RESTful API或GraphQL实现高效稳定通信。本文以示例说明如何使用Vue.js和Node.js构建全栈应用,从前端Vue组件到后端Express服务器,展示了数据获取与展示的全过程。这种组合提供了一种高效简洁的全栈开发方案,使开发者能更专注于业务逻辑实现。
29 0
|
14天前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
23天前
|
JavaScript 前端开发 API
vue中将验证表单输入框的方法写在一个js文件中(表达式验证邮箱、身份证、号码、两次输入的密码是否一致)
这篇文章介绍了如何在Vue框架中将表单输入验证逻辑封装到一个JavaScript文件中,并通过正则表达式验证邮箱、身份证、手机号等信息,同时确保两次密码输入的一致性。
|
JavaScript 前端开发
matrix-gui-2.0 将javascript文件夹改成js文件夹
/******************************************************************************** * matrix-gui-2.0 将javascript文件夹改成js文件夹 * 说明: * 今天在测试的matrix-gui-2.0的时候总是找不到javascript中的js文件,直接访问也 * 提示没有权限索性直接将javascript文件夹名字修改为js,结果可以访问了,好像这个问 * 题之前有遇到过,没有去解决。
797 0
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
68 2
下一篇
DDNS