china365love 发表于 4 天前

按照拍摄日期归类照片按照jpg图片的修改日期归类图片具备年\月\日期 归类

本帖最后由 china365love 于 2025-4-1 11:49 编辑

详细介绍:::   本脚本按照jpg图片的修改日期归类图片,具备 年-月-日、月\日期、年\日期:: 和 年\月\日期 四种归类方式,自动重命名同名文件,能统计处理的图片数量,能:: 把所有子目录里的图片移动到父目录下并删除父目录下的所有空目录。:: 注意:::   当照片导入电脑后,如果进行了除重命名外的其他编辑操作,则很可能导致修:: 改日期不等于照片的拍摄日期,因此,强烈建议从相机中把照片导出后立即运行本:: 程序,否则,极易导致归类错误。:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Code大飞哥软件自习室——书山有路勤为径,学海无涯苦作舟。
:: 功能:按照拍摄日期归类照片
:: 详细介绍:
::   本脚本按照jpg图片的修改日期归类图片,具备 年-月-日、月\日期、年\日期
:: 和 年\月\日期 四种归类方式,自动重命名同名文件,能统计处理的图片数量,能
:: 把所有子目录里的图片移动到父目录下并删除父目录下的所有空目录。
:: 注意:
::   当照片导入电脑后,如果进行了除重命名外的其他编辑操作,则很可能导致修
:: 改日期不等于照片的拍摄日期,因此,强烈建议从相机中把照片导出后立即运行本
:: 程序,否则,极易导致归类错误。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
mode con lines=30
set TT=照片整理器 1.2
color 1f

:source
title %TT%   当前目录:"%cd%"
cls
echo.
echo                  ╭─────────────────────────────╮
echo         ╭────────┤大飞哥软件自习室:温醒提示├────────────────────╮
echo         │      ╰─────────────────────────────╯               │
echo         │                                                      │
echo         │         本程序能把指定文件夹下的jpg格式照片按照拍摄    │
echo         │                                                      │
echo         │    日期整理到如下格式的文件夹下:                      │
echo         │                                                      │
echo         │      1 年-月-日(如 2025-01-01)                     │
echo         │                                                      │
echo         │      2 月\日期(如 01\2025-01-01)                   │
echo         │                                                      │
echo         │      3 年\日期(如 2007\2025-01-01)               │
echo         │                                                      │
echo         │      4 年\月\日期 (如 2025\01\2025-01-01)          │
echo         │                                                      │
echo         │      注意:由于本脚本实际上是按照照片创建日期来整    │
echo         │                                                      │
echo         │    理,所以,把照片导入电脑后,请勿作任何编辑操作。    │
echo         │                                                      │
echo         │      另:重命名照片不会修改照片的创建日期。          │
echo         │                                                      │
echo         ╰───────────────────────────────────────────────╯
echo.
echo            处理当前目录请直接回车                        退出请按 0
echo         ──────────────────────────────               
set Source=
set /p Source=            请把要处理的文件夹拖曳到本窗口:
if not defined Source set "Source=%cd%"
set "Source=%Source:"=%"
if "%Source%"=="0" exit
title %TT%   正在处理目录:"%Source:"=%"
if not exist "%source%\" goto source

:movesub
cls
echo.&echo.&echo.
echo                           ╭─────────╮
echo         ╭────────┤   预处理子目录   ├─────────╮
echo         │                ╰─────────╯                  │
echo         │                                                      │
echo         │         如果当前目录的子目录中存在照片,而你需要把   │
echo         │                                                      │
echo         │    它们都放到父目录下,并删除父目录及其所有子目录下    │
echo         │                                                      │
echo         │    的空文件夹,那么,这个功能将是非常有用的。          │
echo         │                                                      │
echo         │      注意:此处的空文件夹是指删除父目录及其所有子    │
echo         │                                                      │
echo         │    目录下的Thumbs.db和*.ctg文件后形成的空文件夹,以    │
echo         │                                                      │
echo         │    及原本就存在的空文件夹。                            │
echo         │                                                      │
echo         ╰────────────────────────────╯
echo.
echo            返回上一步请按 1                              退出请按 0
echo         ──────────────────────────────
echo.
set MoveSub=
set /p MoveSub=            是否把照片移动到父目录下并删除空目录(Y 是N 否):
if not defined MoveSub goto movesub
set "MoveSub=%MoveSub:"=%"
if "%MoveSub%"=="0" exit
if "%MoveSub%"=="1" goto source
if /i "%MoveSub%"=="y" (
    set num=0
    set WhetherMove=M
    for /f "delims=" %%i in ('dir /ad /b "%Source%\" 2^>nul') do (
      for /f "delims=" %%j in ('dir /a-d /b /s "%Source%\%%i\*.jpg" 2^>nul') do (
            set route=&set postfix=
            if not exist "%Source%\%%~nxi" (
                move "%%j" "%Source%"&& set /a num+=1
            ) else (
                set _num=0
                call :re_name "%%j" "%Source%" "%%~nj"&&set /a num+=1
            )
      )
      title %TT%   正在处理文件:"%%i"
    )
    del /a /f /q /s "%Source%\Thumbs.db">nul 2>nul
    del /a /f /q /s "%Source%\*.ctg">nul 2>nul
    for /f "delims=" %%i in ('dir /ad /b /s "%Source%\"^|sort /r') do (rd /q "%%i" 2>nul&title %TT%   处理文件:"%%i")
    title %TT%   正在处理的目录:"%Source%"
    echo.&call echo               共处理了 %%num%% 张照片,按任意键继续...
    pause>nul
) else if /i not "%MoveSub%"=="n" goto movesub

:whethermove
cls
echo.
echo                           ╭─────────╮
echo         ╭────────┤   照片处理方式   ├─────────╮
echo         │                ╰─────────╯                  │
echo         │                                                      │
echo         │         如果不想删除要处理文件夹下的照片,请选择复   │
echo         │                                                      │
echo         │    制功能;如果不保留原有的照片,请选择移动文件。      │
echo         │                                                      │
echo         │      注意:移动文件后,将会删除父目录下的所有空文    │
echo         │                                                      │
echo         │    件夹。此处的空文件夹是指删除父目录及其所有子目录    │
echo         │                                                      │
echo         │    下的Thumbs.db和*.ctg文件后形成的空文件夹,以及原    │
echo         │                                                      │
echo         │    本就存在的空文件夹。                              │
echo         │                                                      │
echo         │      另:同名文件将作重命名处理,具体方式为:在文    │
echo         │                                                      │
echo         │    件名后添加 -序号 。比如重命名为 abc-1.jpg          │
echo         │                                                      │
echo         ╰────────────────────────────╯
echo.
echo            返回上一步请按 1                              退出请按 0
echo         ──────────────────────────────
echo.
set WhetherMove=
set /p WhetherMove=                   移动文件还是复制文件(M 移动C 复制):
if not defined WhetherMove goto whethermove
set "WhetherMove=%WhetherMove:"=%"
if "%WhetherMove%"=="0" exit
if "%WhetherMove%"=="1" goto movesub
set flag=
if /i "%WhetherMove%"=="M" set flag=1
if /i "%WhetherMove%"=="C" set flag=1
if not defined flag goto whethermove
if /i "%MoveSub%"=="y" goto destination

:whethersub
echo.
set WhetherSub=
set /p WhetherSub=                   是否处理子目录(Y 是N 否):
if not defined WhetherSub goto whethersub
set "WhetherSub=%WhetherSub:"=%"
if /i "%WhetherSub%"=="y" (set WhetherSub=/s) else set WhetherSub=

:destination
echo.
title %TT%   程序所在目录:"%cd%"
set Destination=
set /p Destination=          请输入保存路径(保存在程序所在目录下请直接回车):
if not defined Destination set "Destination=%cd%"
set "Destination=%Destination:"=%"
md "%Destination%" 2>nul

:folders
cls
echo.&echo.&echo.
echo                           ╭─────────╮
echo         ╭────────┤选择目录树格式├─────────╮
echo         │                ╰─────────╯                  │
echo         │                                                      │
echo         │         在保存路径下,将建立以照片拍摄日期为名的文   │
echo         │                                                      │
echo         │    件夹,这些文件夹的目录树结构如下:                  │
echo         │                                                      │
echo         │      a 年-月-日(如 2025-01-01)                     │
echo         │                                                      │
echo         │      b 月\日期(如 01\2025-01-01)                   │
echo         │                                                      │
echo         │      c 年\日期(如 2007\2025-01-01)               │
echo         │                                                      │
echo         │      d 年\月\日期 (如 2025\01\2025-01-01)          │
echo         │                                                      │
echo         ╰────────────────────────────╯
echo.
echo            返回上一步请按 1                              退出请按 0
echo         ──────────────────────────────
echo.
set FoldersTree=
set /pFoldersTree=                                 请选择(a/b/c/d):
if not defined FoldersTree goto folders
set "FoldersTree=%FoldersTree:"=%"
if "%FoldersTree%"=="0" exit
if "%FoldersTree%"=="1" goto whethermove
set choice=
for %%i in (a b c) do if /i "%FoldersTree%"=="%%i" set choice=1
if not defined choice goto folders
echo.&echo                              正在处理中,请稍候...
set num=0
for /f "delims=" %%i in ('dir /a-d /b %WhetherSub% "%Source%\*.jpg" 2^>nul') do (
    set /a num+=1
    if defined WhetherSub (
      for /f "delims=" %%j in ("%%i") do (
            set str=%%~tj
            set route=&set postfix=
            setlocal enabledelayedexpansion
            set str=!str:~0,10!
            set Y=!str:~0,4!&set M=!str:~5,2!&set D=!str:~8,2!
            if /i "%FoldersTree%"=="a" set Y=&set M=
            if /i "%FoldersTree%"=="b" set Y=
            if /i "%FoldersTree%"=="c" set M=
            md "%Destination%\!Y!\!M!\!str!" 2>nul
            if /i "%WhetherMove%"=="M" (
                if not exist "%Destination%\!Y!\!M!\!str!\%%~nxi" (
                  move "%%i" "%Destination%\!Y!\!M!\!str!" 2>nul
                ) else (
                  call :re_name "%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
                )
            ) else (
                if not exist "%Destination%\!Y!\!M!\!str!\%%~nxi" (
                  copy "%%i" "%Destination%\!Y!\!M!\!str!">nul 2>nul
                ) else (
                  call :re_name "%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
                )
            )
            title %TT%   正在处理文件:"%%i"
            endlocal
      )
    ) else (
      for /f "delims=" %%j in ("%Source%\%%i") do (
            set str=%%~tj
            set route=&set postfix=
            setlocal enabledelayedexpansion
            set str=!str:~0,10!
            set Y=!str:~0,4!&set M=!str:~5,2!&set D=!str:~8,2!
            if /i "%FoldersTree%"=="a" set Y=&set M=
            if /i "%FoldersTree%"=="b" set Y=
            if /i "%FoldersTree%"=="c" set M=
            md "%Destination%\!Y!\!M!\!str!" 2>nul
            if /i "%WhetherMove%"=="M" (
                if not exist "%Destination%\!Y!\!M!\!str!\%%i" (
                  move "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" 2>nul
                ) else (
                  call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
                )
            ) else (
                if not exist "%Destination%\!Y!\!M!\!str!\%%i" (
                  copy "%Source%\%%i" "%Destination%\!Y!\!M!\!str!">nul 2>nul
                ) else (
                  call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
                )
            )
            title %TT%   正在处理文件:"%Source%\%%~nxi"
            endlocal
      )
    )
)
title %TT%   当前目录:"%cd%"
if /i "%WhetherMove%"=="M" (
    del /a /f /q /s "%Source%\Thumbs.db">nul 2>nul
    del /a /f /q /s "%Source%\*.ctg">nul 2>nul
    for /f "delims=" %%i in ('dir /ad /b /s "%Source%\"^|sort /r') do (rd /q "%%i" 2>nul)
    rd /q "%Source%" 2>nul
)
echo.&echo                        共处理了 %num% 张照片,按任意键继续...
pause>nul&goto source

:re_name
if not defined route (
    set "route=%~2"
    set "filename=%~3"
)
if not exist "%route%\%filename%%postfix%.jpg" (
    if /i "%WhetherMove%"=="M" (
      move "%~1" "%route%\%filename%%postfix%.jpg" 2>nul
    ) else copy "%~1" "%route%\%filename%%postfix%.jpg">nul 2>nul
) else (
    set /a _num+=1
    call set "postfix=-%%_num%%"
    goto re_name
)
goto :eof2. 创建 JavaScript 脚本(script.js)document.getElementById('photo - form').addEventListener('submit', function (e) {    e.preventDefault();
    const sourceFolder = document.getElementById('source - folder').value;
    const moveSubFolders = document.getElementById('move - sub - folders').value;
    const moveOrCopy = document.getElementById('move - or - copy').value;
    const processSubDirs = document.getElementById('process - sub - dirs').value;
    const destinationFolder = document.getElementById('destination - folder').value;
    const foldersTree = document.getElementById('folders - tree').value;

    // 这里可以使用fetch将数据发送到服务器端进行处理
    // 示例:
    fetch('/process - photos', {
      method: 'POST',
      headers: {
            'Content - Type': 'application/json'
      },
      body: JSON.stringify({
            sourceFolder,
            moveSubFolders,
            moveOrCopy,
            processSubDirs,
            destinationFolder,
            foldersTree
      })
    })
      .then(response => response.json())
      .then(data => {
            document.getElementById('log').innerHTML = `共处理了 ${data.num} 张照片`;
      })
      .catch(error => {
            console.error('Error:', error);
            document.getElementById('log').innerHTML = '处理过程中出现错误';
      });
});

3. 使用 Node.js 和 Express 创建服务器端(server.js)
const express = require('express');
const app = express();
const path = require('path');
const fs = require('fs');
const { promisify } = require('util');

app.use(express.json());

// 模拟批处理中的文件移动和重命名逻辑
async function processPhotos(data) {
    const { sourceFolder, moveSubFolders, moveOrCopy, processSubDirs, destinationFolder, foldersTree } = data;
    let num = 0;
    // 这里需要根据实际需求完善文件处理逻辑,例如读取文件、创建目录、移动/复制文件等
    // 示例:读取源文件夹中的文件
    try {
      const files = await promisify(fs.readdir)(sourceFolder);
      for (const file of files) {
            if (file.endsWith('.jpg')) {
                num++;
                // 模拟根据日期创建目录和移动/复制文件
                const fileStat = await promisify(fs.stat)(path.join(sourceFolder, file));
                const date = fileStat.mtime.toISOString().split('T');
                const = date.split('-');
                let destDir = destinationFolder;
                if (foldersTree === 'a') {
                  destDir = path.join(destDir, date);
                } else if (foldersTree === 'b') {
                  destDir = path.join(destDir, month, date);
                } else if (foldersTree === 'c') {
                  destDir = path.join(destDir, year, date);
                } else if (foldersTree === 'd') {
                  destDir = path.join(destDir, year, month, date);
                }
                await promisify(fs.mkdir)(destDir, { recursive: true });
                const destPath = path.join(destDir, file);
                if (moveOrCopy === 'M') {
                  await promisify(fs.rename)(path.join(sourceFolder, file), destPath);
                } else {
                  await promisify(fs.copyFile)(path.join(sourceFolder, file), destPath);
                }
            }
      }
      return { num };
    } catch (error) {
      console.error('Error processing photos:', error);
      throw error;
    }
}

app.post('/process - photos', async (req, res) => {
    try {
      const result = await processPhotos(req.body);
      res.json(result);
    } catch (error) {
      res.status(500).json({ error: 'Internal Server Error' });
    }
});

const port = 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});
上述代码创建了一个简单的 HTML 界面,用户可以在其中输入整理照片所需的参数。JavaScript 代码将这些参数发送到 Node.js 服务器,服务器端模拟了批处理脚本中的文件处理逻辑,根据用户选择的选项对照片进行整理。请根据实际需求进一步完善文件处理逻辑,例如处理子目录、重命名同名文件等功能。

sparker351 发表于 4 天前

看着就很高级的样子

dsfive 发表于 4 天前

很不错,省好多时间

linxiansen 发表于 4 天前

PYG19周年生日快乐

linxiansen 发表于 4 天前

PYG20周年生日快乐!

chchhau 发表于 4 天前

谢谢谢谢非常感谢

mapshadow 发表于 4 天前

这个非常实用

杨林 发表于 前天 09:49

多谢楼主分享!

少马石 发表于 前天 10:24

和namejm高度一致,并且缺乏处理照片的零件

sunboyzh 发表于 前天 10:35

不错的工具 感谢~
页: [1] 2
查看完整版本: 按照拍摄日期归类照片按照jpg图片的修改日期归类图片具备年\月\日期 归类