파일 정리 스트립트 (clone)

요구사항

  1. pictures라는 폴더 안에 videos, photos가 있다.
  2. mp4, mov 확장자 동영상 파일은 videos 폴더로 이동.
  3. png, aae 확장자 파일들은 captured 폴더로 이동.
  4. IMG_0000(원본파일)와 IMG_E0000(수정파일)가 있다는 경우라면
    1) 편집한 사진인 E가 있는 파일명은 그대로 보관.
    2) 편집하지 않은 IMG_0000는 duplicated 폴더로 이동.
  5. 편집본이 없는 IMG_0000의 경우는 그대로 보관.

계획

  1. 사용자가 원하는 폴더의 이름을 받아온다.
  2. 그 폴더 안에서 videos, catpured, duplicated 폴더를 생성한다.
  3. 폴더 안에 있는 파일들을 돌면서 해당하는 폴더로 이동시키다.

구현

import path from 'path';
import fs from 'fs';
import { promises as fsPromises } from 'fs';
import process from 'process';

const __dirname = path.resolve();

let folder = process.argv[2];
let basefile = path.join(__dirname, '..', 'pictures', folder);

// 없는 폴더를 입력하였거나 잘못된 폴더를 입력하였다면 적절한 메시지를 보내준다.
if (!folder || !fs.existsSync(basefile)) {
  console.error('please enter folder name in pictures');
}

const makeDir = (folder) => {
  let folderDir = path.join(basefile, folder);
  // 이미 존재했을 때를 먼저 처리해준다.
  !fs.existsSync(folderDir) && fsPromises.mkdir(folderDir).catch(console.error);
};

const moveFile = (dir, file) => {
// 이동 파일에 대한 정보를 제공한다.
  console.info(`move ${file} to ${dir}`);
  
  let oldpath = path.join(basefile, file);
  let newpath = path.join(basefile, dir, file);
  fsPromises.rename(oldpath, newpath).catch(console.error);
};

fsPromises
  .readdir(basefile)
  .then((file) => {
    makeDir('videos');
    makeDir('captured');
    makeDir('duplicated');
    return file;
  })
  .then((file) => {
    file.forEach((v) => {
      if (path.extname(v) === '.mp4' || path.extname(v) === '.mov') {
        moveFile('videos', v);
      } else if (path.extname(v) === '.png' || path.extname(v) === '.aae') {
        moveFile('captured', v);
      } else if (
        !v.includes(`IMG_E`) &&
        v.includes(`IMG_`) &&
        file.includes(`IMG_E${v.slice(4)}`)
      ) {
        moveFile('duplicated', v);
      }
    });
  })
  .catch(console.error);

좋은 웹페이지 즐겨찾기