hudada-cli
Version:
专为程序员准备的本地文档搜索,快捷开发工具
3 lines (2 loc) • 3.79 kB
JavaScript
import e,{existsSync as t}from"fs";import o from"path";import r from"chalk";let n=0;async function i(){try{const e=function(e){const t={};let o=e.slice(2);o.length>0&&!o[0].includes("=")&&(t.path=o[0],o.shift());for(const e of o)if(e.includes("=")){const[o,r]=e.split("="),n=o.replace(/^-+/,""),i=r.replace(/^["']|["']$/g,"");t[n]=i}return t}(process.argv),i=process.cwd();if(console.log(i),!t(i))return void console.error(r.red(`路径不存在: ${i}`));delete e.path;const a=e;console.log(r.cyan("开始搜索:")),console.log(r.gray(`搜索路径: ${i}`)),console.log(a),Object.keys(a).length>0&&(console.log(r.gray("搜索条件:")),a.name&&console.log(r.gray(`- 名称: ${a.name}`)),a.type&&console.log(r.gray("- 类型: "+("f"===a.type?"文件":"目录"))),a.size&&console.log(r.gray(`- 大小: ${a.size}`)),a.ext&&console.log(r.gray(`- 扩展名: ${a.ext}`)),a.mtime&&console.log(r.gray(`- 修改时间: ${a.mtime}天内`)),a.maxdepth&&console.log(r.gray(`- 最大深度: ${a.maxdepth}`)));const c=[],g=Date.now();if(await s(i,a,c,0),c.sort(((e,t)=>e.type!==t.type?"directory"===e.type?-1:1:o.basename(e.path).localeCompare(o.basename(t.path)))),0===c.length)console.log(r.yellow("\n未找到匹配项"));else{console.log(r.green(`\n找到 ${c.length} 个匹配项:`));for(const e of c){const t=o.resolve(i,e.path),s=o.basename(e.path),a="directory"===e.type?r.blue:r.white;console.log(a(u(s,30))+r.gray(u(l(e.size),12))+r.gray(u(e.modified.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),20))+r.gray(t)),n++}}const m=((Date.now()-g)/1e3).toFixed(1);console.log(r.gray(`\n搜索完成,耗时 ${m} 秒,发现文件数量:${n}`))}catch(e){console.error(r.red("搜索失败:"),e)}}async function s(t,n,i,c){if(void 0!==n.maxdepth&&c>n.maxdepth)return;let l;try{l=await e.readdirSync(t,{withFileTypes:!0})}catch(e){return void console.error(r.yellow(`警告: 无法访问目录 ${t}: ${e.message}`))}for(const u of l){if(u.name.startsWith(".")||"node_modules"===u.name)continue;const l=o.join(t,u.name);try{const t=await e.statSync(l);a(u,t,n)&&i.push({path:l,type:u.isDirectory()?"directory":"file",size:t.size,modified:t.mtime}),u.isDirectory()&&await s(l,n,i,c+1)}catch(e){console.error(r.yellow(`警告: 无法访问文件 ${l}: ${e.message}`));continue}}}function a(e,t,r){if(r.type){if("f"===r.type&&e.isDirectory())return!1;if("d"===r.type&&!e.isDirectory())return!1}if(r.name){if(!new RegExp(r.name.replace(/\*/g,".*")).test(e.name))return!1}if(r.ext&&!e.isDirectory()){if(o.extname(e.name).toLowerCase()!==`.${r.ext.toLowerCase()}`)return!1}if(r.size&&!e.isDirectory()){const e=function(e){if(e.includes("-")){const[t,o]=e.split("-"),r=c(t),n=c(o);return r&&n?{op:"range",size:r,size2:n}:null}const t=e.match(/^([<>]=?|=)?\s*(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)?$/i);if(!t)return null;const[,o="=",r,n]=t,i=c(`${r}${n||""}`);return i?{op:o,size:i}:null}(r.size);if(e&&!function(e,t){switch(t.op){case">":return e>t.size;case"<":return e<t.size;case">=":return e>=t.size;case"<=":return e<=t.size;case"=":return Math.abs(e-t.size)<1;case"range":return void 0!==t.size2&&e>=t.size&&e<=t.size2;default:return!1}}(t.size,e))return!1}if(r.mtime){const e=t.mtime.getTime();if((Date.now()-e)/864e5>r.mtime)return!1}return!0}function c(e){const t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)?$/i);if(!t)return null;const[,o,r]=t;let n=1;switch(r?.toUpperCase()){case"KB":n=1024;break;case"MB":n=1048576;break;case"GB":n=1073741824;break;case"TB":n=1099511627776}return parseFloat(o)*n}function l(e){if(0===e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,t)).toFixed(1)} ${["B","KB","MB","GB","TB"][t]}`}function u(e,t){return String(e).padEnd(t)}export{i as findItems};