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月前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
35 0
|
2月前
|
前端开发 JavaScript API
前端JS读取文件内容并展示到页面上
前端JavaScript使用FileReader API读取文件内容,支持文本类型文件。在文件读取成功后,可以通过onload事件处理函数获取文件内容,然后展示到页面上。
85 2
前端JS读取文件内容并展示到页面上
|
2月前
|
JavaScript 前端开发 数据安全/隐私保护
混淆指定js文件
【9月更文挑战第26天】JavaScript 混淆旨在保护代码知识产权、减小文件体积和提高安全性。方法包括变量名和函数名混淆、代码压缩、控制流平坦化及字符串加密。常用工具如 UglifyJS 和 JScrambler 可实现这些功能。然而,混淆可能带来兼容性和调试困难等问题,需谨慎使用并确保法律合规。
|
1月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
141 0
|
2月前
|
移动开发 JavaScript 前端开发
js之操作文件| 12-5
js之操作文件| 12-5
|
1月前
|
JavaScript
js之遍历方法
js之遍历方法
10 0
|
JavaScript 数据安全/隐私保护
|
2月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
1月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
26 2
|
2月前
|
存储 JavaScript 前端开发
Node 版本控制工具 NVM 的安装和使用(Windows)
本文介绍了NVM(Node Version Manager)的Windows版本——NVM for Windows的安装和使用方法,包括如何安装Node.js的特定版本、列出已安装版本、切换使用不同版本的Node.js,以及其他常用命令,以实现在Windows系统上对Node.js版本的便捷管理。
Node 版本控制工具 NVM 的安装和使用(Windows)