• 作者:老汪软件技巧
  • 发表时间:2024-10-08 11:01
  • 浏览量:

说在前面

最近裸辞出去玩了两个多月,旅行的过程中少不了拍照,祖国的大好河山太美了,一趟旅行下来产出了1w多张图片,所以回来后总要整理一下图片,我这边想要的是根据拍摄时间来对图片进行分组,所以回到家后我就写了这样一个脚本来处理图片。

工具实现1、模块导入

通过require("@jyeontu/j - inquirer")导入,用于创建命令行交互,让用户选择需要分组的目录。

使用require("fs")导入,用于进行文件系统的操作,如读取目录内容(readdirSync)、获取文件状态(statSync)、创建文件夹(mkdirSync)以及复制文件(copyFileSync)等操作。path模块:通过require("path")导入,用于处理文件路径,如拼接路径(join)等操作。

使用require("exif").ExifImage导入,用于读取图片的 Exif 数据,以便获取图片的拍摄时间。

2、获取图片拍摄时间

function getPictureTakingTime(imagePath) {
  return new Promise((resolve) => {
    try {
      new ExifImage({ image: imagePath }, function (error, exifData) {
        if (error) {
          resolve(null);
        } else {
          if (exifData && exifData.exif) {
            const takingTime = exifData.exif.DateTimeOriginal;
            resolve(takingTime);
          } else {
            resolve(null);
          }
        }
      });
    } catch (error) {
      resolve(null);
    }
  });
}

3、通过交互获取需要分组的目录

const baseDir = process.cwd();
const options = [
  {
    type: "folder",
    message: "请选择需要分组的目录:",
    name: "directory",
    default: "",
    dirname: baseDir,
  },
];
const answers = await new inquirer(options).prompt();
const dirPath = answers.directory;

4、遍历文件并分组

const files = fs.readdirSync(dirPath);
const map = {};
let sum = 0;
console.log(`正在获取图片信息,请稍等……`);
for (const file of files) {
  const newPath = path.join(dirPath, file);
  const info = fs.statSync(newPath);
  if (!info.isFile()) {
    continue;
  }
  sum++;
  const m = (await getPictureTakingTime(newPath)) || dateFormat(info.mtime);
  const mArr = m.split(" ");
  mArr[0] = mArr[0].split(":").join("-");
  const mtime = dateFormat(mArr.join(" "));
  if (!map[mtime]) {
    map[mtime] = [];
  }
  map[mtime].push(file);
}

5、创建分组目录并移动文件

for (const key in map) {
  const keyPath = path.join(dirPath, key);
  if (!fs.existsSync(keyPath)) {
    fs.mkdirSync(keyPath);
  }
  for (const p of map[key]) {
    const np = path.join(keyPath, p);
    if (fs.existsSync(np)) {
      continue;
    }
    fs.copyFileSync(path.join(dirPath, p), path.join(keyPath, p));
  }
}

使用

该工具已经发布到 npm 上,可以直接通过命令npm i -g jyeontu进行安装,安装完后在控制台中输入jyeontu file即可进行操作。选择图片分组即可:

源码Gitee

该工具的源码也已经开源,有兴趣的同学可以到Gitee上查看:/zheng_yongt…

欢迎star~

公众号