Skip to content

Instantly share code, notes, and snippets.

@Pomdre
Last active October 26, 2023 19:24
Show Gist options
  • Save Pomdre/af4fd63caf02cc232c0b90e4a51ed058 to your computer and use it in GitHub Desktop.
Save Pomdre/af4fd63caf02cc232c0b90e4a51ed058 to your computer and use it in GitHub Desktop.
Image organiser/sorting script for windows
@REM This is a script for taking Files in src_folder and move them to dest_root_folder organised under the year and month the image or file was created.
@REM For the best preformence install exiftool by Phil Harvey othervise it would use the file's modification date.
@echo off
setlocal enabledelayedexpansion
rem Source folder containing images
set "src_folder=C:\Uploads\Camera"
rem Destination folder for organizing images
set "dest_root_folder=C:\Uploads\Camera\Sorted"
rem Create destination root folder if it doesn't exist
if not exist "%dest_root_folder%" mkdir "%dest_root_folder%"
rem Loop through each image file in the source folder
for %%I in ("%src_folder%\*.jpg" "%src_folder%\*.jpeg" "%src_folder%\*.png" "%src_folder%\*.gif" "%src_folder%\*.mp4" "%src_folder%\*.heic" "%src_folder%\*.heif" "%src_folder%\*.dng") do (
if exist "%%~I" (
rem Initialize variables for date
set "creation_date="
rem Try to extract DateTimeOriginal using ExifTool
for /f %%A in ('exiftool -d "%%Y-%%m" -p "$DateTimeOriginal" "%%~I" 2^>nul') do (
set "creation_date=%%A"
)
rem If DateTimeOriginal is not defined, try to extract 'Changed' date using ExifTool
if not defined creation_date (
for /f %%A in ('exiftool -d "%%Y-%%m" -p "$FileModifyDate" "%%~I" 2^>nul') do (
set "creation_date=%%A"
)
)
rem If neither DateTimeOriginal nor 'Changed' date is available, use the file's modification date
if not defined creation_date (
for /f %%A in ('powershell -command "(Get-Item '%%~I').CreationTime.ToString('yyyy-MM')"') do (
set "creation_date=%%A"
)
)
rem Check if a date was successfully retrieved
if defined creation_date (
rem Split the creation_date into year and month
for /f "tokens=1,2 delims=-" %%Y in ("!creation_date!") do (
set "year=%%Y"
set "month=%%Z"
rem Create the year folder inside the destination root folder if it doesn't exist
set "dest_year_folder=!dest_root_folder!\!year!"
if not exist "!dest_year_folder!" mkdir "!dest_year_folder!"
rem Create the month folder inside the year folder if it doesn't exist
set "dest_month_folder=!dest_year_folder!\!month!"
if not exist "!dest_month_folder!" mkdir "!dest_month_folder!"
rem Move the image to the month folder
move "%%~I" "!dest_month_folder!\"
echo Moved "%%~I" to "!dest_month_folder!\"
)
) else (
echo Failed to extract creation date from "%%~I"
)
)
)
echo Organizing complete.
pause
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment