LHJ

I'm a FE developer.

file name change4 complete

24 Jun 2020 » node

filename_change.js
download

/\n/g/(\r\n|\r|\n)/g로 교체

이유 :
OS마다 다르다. 리툭스는 \n 개행 정규식을 사용하고, window는 \n\r을 사용, 예전 맥에서는 \r을 사용한다.
즉 이 모두를 아우를 수 있는 정규식으로 대체했다.

  • /\n/g/(\r\n|\r|\n)/g로 교체
  • index.html 과 실제 src/html/~.html 을 비교하여 src/html/~.html엔 있지만 index.html에 기재되어있지 않은 파일은 파일명 앞에 999999_가 붙게하였습니다.
  • 기존 index.html에 기록되어있던 리스트의 순서묶여있는 항목이 같도록 했습니다.
  • 기존 파일명에 923_filename.html 또는 42_filename.html 또는 6_filename.html 으로 되어있는 경우는 앞에 숫자와 언더바를 지운 후 파일명이 순서대로 바뀌도록 했습니다.
  • index.html 엔 기재되어있지만 src/html/~.html 엔 존재하지 않는 파일은 notExit.txt 파일에 기록하여 내보냅니다.

  •     'use strict';
          
        // node file system module and path module
        const fs = require('fs'),
            path = require('path');
          
        const indexList = fs.readFileSync('./index.html', 'utf8');
        const realFile = fs.readdirSync('./src/html/');
        let realHtmlFile = [];
        const compare = indexList.match(/[src]*\/*html\/(.*?)\.html/g);
        let compareBaseName = [];
        const arr = indexList.replace(/(\r\n|\r|\n)/g, '').match(/<ul>(.*?)<\/ul>/g);
        let arr2 = [];
        let obj = {};
        let notExit = {};
          
        // 실제 존재하는데 index.html 상에 기록되지 않은 파일을 위한 식
        // 실제 존재하는 html 파일
        realFile.map(file => path.join('./src/html/', file))
            .filter(file => fs.statSync(file).isFile())
            .forEach(file => {
                const extname = path.extname(file);
                const basename = path.basename(file);
                if (extname === '.html') {
                    realHtmlFile.push(String(basename));
                }
            })
          
        // index.html 리스트 상에서만 존재하는 html 파일
        for (let k=0; k<compare.length; k++) {
            compareBaseName.push(path.basename(compare[k]));
        }
          
        // 실제 존재하는 HTML 파일과 index.html 상에 기록되어있는 html 파일 비교
        for (let o=0; o<realHtmlFile.length; o++) {
            if(!compareBaseName.some(x => x === realHtmlFile[o])) {
                let oldPath = path.join('./src/html', realHtmlFile[o]);
                let newPath = path.join('./src/html', '99_' + realHtmlFile[o]);
                obj[oldPath] = newPath;
            }
        }
          
          
        // index.html에 기재되어있는 파일들 이름 바꾸기
        arr.forEach(cont => arr2.push(cont.match(/[src]*\/*html\/(.*?)\.html/g)));
          
        let arr2Compare = [];
        for (let p=0; p<arr2.length; p++) {
            for (let v=0; v<arr2[p].length; v++) {
                if (!arr2Compare[p]) arr2Compare[p] = [];
                arr2Compare[p].push(arr2[p][v].replace(/[src]*\/*[html]*\//, ''))
            }
        }
          
        for (let i=0; i<arr2.length; i++) {
            let n = i < 10? '0'+i : i;
            let m = 0;
            for (let j=0; j<arr2[i].length; j++) {
                m = j < 10? '0' + j : j;
                if(!realHtmlFile.some(x => x === arr2Compare[i][j])) {
                    let oldPath = path.join('./src/html', 'notExit.txt');
                    let newPath = path.join('./src/html', arr2Compare[i][j]);
                    if (!Array.isArray(notExit[oldPath])) notExit[oldPath] = [];
                    notExit[oldPath].push(newPath);
                } else {
                    let b = path.basename(arr2[i][j]);
                    let bkey = path.join('./src/html', b);
                    let s = n + '_' + m + '_' + b.replace(/[0-9]{1,}_/g, '');
                    obj[bkey] = path.join('./src/html/', s);
                }
            }
        }
          
        for (const property in obj) {
            fs.rename(property, obj[property], (err) => {
                if (err) throw err;
                console.log('Rename complete!');
            })
        }
          
          
        for (const property in notExit) {
            fs.writeFile(property, notExit[property], (err) => {
                if (err) throw err;
                console.log('The file has been saved!');
            });
        }
    
  •   {
        "name": "filenamechange",
        "version": "1.0.0",
        "description": "",
        "main": "fileNameChange.js",
        "scripts": {
          "test": "echo \"Error: no test specified\" && exit 1"
        },
        "author": "",
        "license": "ISC"
      }