- 作者:老汪软件技巧
- 发表时间: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~
公众号