飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 447|回复: 10

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

[复制链接]
  • TA的每日心情
    开心
    2024-8-8 11:24
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 前天 11:39 | 显示全部楼层 |阅读模式
    本帖最后由 china365love 于 2025-4-1 11:49 编辑

    详细介绍:
    ::   本脚本按照jpg图片的修改日期归类图片,具备 年-月-日、月\日期、年\日期
    :: 和 年\月\日期 四种归类方式,自动重命名同名文件,能统计处理的图片数量,能
    :: 把所有子目录里的图片移动到父目录下并删除父目录下的所有空目录。
    QQ20250401-114236.png
    :: 注意:
    ::   当照片导入电脑后,如果进行了除重命名外的其他编辑操作,则很可能导致修
    :: 改日期不等于照片的拍摄日期,因此,强烈建议从相机中把照片导出后立即运行本
    :: 程序,否则,极易导致归类错误。
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    [ColdFusion] 纯文本查看 复制代码
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[/align]:: 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 /p  FoldersTree=                                 请选择(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 :eof
    2. 创建 JavaScript 脚本(script.js)
    [Java] 纯文本查看 复制代码
    document.getElementById('photo - form').addEventListener('submit', function (e) {[/font][/color][/b]    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)
    [JavaScript] 纯文本查看 复制代码
    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')[0];
                    const [year, month, day] = 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}`);
    });

    [color=rgba(0, 0, 0, 0.85)]上述代码创建了一个简单的 HTML 界面,用户可以在其中输入整理照片所需的参数。JavaScript 代码将这些参数发送到 Node.js 服务器,服务器端模拟了批处理脚本中的文件处理逻辑,根据用户选择的选项对照片进行整理。请根据实际需求进一步完善文件处理逻辑,例如处理子目录、重命名同名文件等功能。
    QQ20250401-113307.png

    大飞哥软件自习室照片按年月日时间分类软件.rar

    2.72 KB, 下载次数: 16, 下载积分: 飘云币 -2 枚

    售价: 1 枚飘云币  [记录]

    成品

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2025-1-13 10:56
  • 签到天数: 374 天

    [LV.9]以坛为家II

    发表于 前天 13:19 | 显示全部楼层
    看着就很高级的样子
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 08:57
  • 签到天数: 706 天

    [LV.9]以坛为家II

    发表于 前天 13:43 | 显示全部楼层
    很不错,省好多时间
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 13:49
  • 签到天数: 393 天

    [LV.9]以坛为家II

    发表于 前天 14:30 | 显示全部楼层
    PYG19周年生日快乐
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 13:49
  • 签到天数: 393 天

    [LV.9]以坛为家II

    发表于 前天 14:53 | 显示全部楼层
    PYG20周年生日快乐!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-1-13 09:04
  • 签到天数: 339 天

    [LV.8]以坛为家I

    发表于 前天 17:08 | 显示全部楼层
    谢谢  谢谢  非常感谢
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-12-29 09:34
  • 签到天数: 605 天

    [LV.9]以坛为家II

    发表于 前天 23:23 | 显示全部楼层
    这个非常实用
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 07:47
  • 签到天数: 1855 天

    [LV.Master]伴坛终老

    发表于 9 小时前 | 显示全部楼层
    多谢楼主分享!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-10 13:58
  • 签到天数: 697 天

    [LV.9]以坛为家II

    发表于 9 小时前 | 显示全部楼层
    和namejm高度一致,并且缺乏处理照片的零件
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 12:15
  • 签到天数: 374 天

    [LV.9]以坛为家II

    发表于 8 小时前 | 显示全部楼层
    不错的工具 感谢~
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表