VScode搜索功能图示:
关键点:读取目录文件夹,判断是否文件夹,若是递归继续读取,否则通过正则或普通匹配关键词。
统计唯一文件名数量,统计总搜索记录数量累加,展示结果。
Core code:
const fs = require('fs'); const path = require('path'); // const basePath = path.resolve('src'); // const matchFile = /\.(jsx?|css)$/; const basePath = path.normalize('D:\\Dev\\xxx\\src\\main\\webapp'); const matchFile = /\.(jsp?|css)$/; const searchWord = /\/assetWithdraw\/.*?\.html/img; const matchList = {}; let fileCount = 0; const isDirectory = source => fs.lstatSync(source).isDirectory(); const getDirectories = source => fs.readdirSync(source).map(fileName => { const newPath = path.join(source, fileName); if (isDirectory(newPath)) { getDirectories(newPath); } else { if (matchFile.test(fileName)) { const contents = fs.readFileSync(newPath, 'utf8'); let matchs = contents.match(searchWord); if (matchs) { fileCount += 1; matchs.map(v => { matchList[newPath] = (matchList[newPath] || 0) + 1; }); } } } }); getDirectories(basePath); const sortList = Object.keys(matchList); console.log(`Stat: ${Object.values(matchList).reduce((a,b) => a+b, 0)} results in ${fileCount} files (Unique of ${sortList.length})\n`); console.log(sortList.map((v, i) => `${i+1}, ${v} (${matchList[v]})`).join('\n'));
搜索结果print:
Stat: 179 results in 65 files (Unique of 65) 1, D:xxx.js (1) 2, D:xxx.js (6) 3, D:xxx.js (1) 4, D:xxx.js (3) 5, D:xxx.js (4) 6, D:xxx.js (1) 7, D:xxx.js (2) 8, D:xxx.js (1) 9, D:xxx.js (1) 10, D:xxx.js (2) 11, D:xxx.js (2) 12, D:xxx.js (2) 13, D:xxx.js (5) 14, D:xxx.js (1) 15, D:xxx.js (2) 16, D:xxx.js (1) 17, D:xxx.js (4) 18, D:xxx.js (2) 19, D:xxx.js (1) 20, D:xxx.js (1) 21, D:xxx.js (1) 22, D:xxx.js (1) 23, D:xxx.js (2) 24, D:xxx.js (7) 25, D:xxx.js (1) 26, D:xxx.js (2) 27, D:xxx.js (1) 28, D:xxx.js (4) 29, D:xxx.js (2) 30, D:xxx.js (1) 31, D:xxx.js (1) 32, D:xxx.js (1) 33, D:xxx.js (1) 34, D:xxx.js (2) 35, D:xxx.js (7) 36, D:xxx.js (1) 37, D:xxx.js (2) 38, D:xxx.js (1) 39, D:xxx.js (4) 40, D:xxx.js (2) 41, D:xxx.js (1) 42, D:xxx.js (1) 43, D:xxx.js (1) 44, D:xxx.js (1) 45, D:xxx.js (2) 46, D:xxx.js (6) 47, D:xxx.js (13) 48, D:xxx.js (3) 49, D:xxx.js (3) 50, D:xxx.js (1) 51, D:xxx.js (4) 52, D:xxx.js (1) 53, D:xxx.js (3) 54, D:xxx.js (3) 55, D:xxx.js (13) 56, D:xxx.js (3) 57, D:xxx.js (3) 58, D:xxx.js (13) 59, D:xxx.js (3) 60, D:xxx.js (3) 61, D:xxx.js (3) 62, D:xxx.js (1) 63, D:xxx.js (4) 64, D:xxx.js (1) 65, D:xxx.js (2)