본문 바로가기

Programming/Bash

[Bash] Photos, Files auto sorting script on Windows,Linux,Mac by dates



setlocal enabledelayedexpansion
set /p input=Enter the target directory:%=%
set RawData=!input!\*.*
set target_folder=x:\
for %%a in ("%RawData%") do (
        echo Processing %%~nxa ...
        set File=%%~fa
        for /f "tokens=1* delims=," %%a in ('wmic datafile where "name='!File:\$
        echo %%~nxa: !LastModified!
        set cYear=!LastModified:~0,4!
        set cMonth=!LastModified:~4,2!
        set cDay=!LastModified:~6,2!
        set TimeStamp=!cYear!-!cMonth!-!cDate!
        if not exist "%target_folder%\!TimeStamp!" (
                md "%target_folder%\!TimeStamp!"
        )
        move "!File!" "%target_folder%\!TimeStamp!"
)

 

target_folder는 원하는 디렉토리로 바꾸면 되고 매번 바뀐다면 user input으로 받아서 그걸 사용하게 해도 된다

생선된 날짜되신 "마지막 바뀐?"날로 폴더를 만들게 만들었다 Linux에서도 그렇지만 Windows에서도  Created date은 에러가 있는거 같다.

 

 

다음은  Linux bash script

 

#!/bin/bash

read -p "Enter the source directory >" source_dir
read -p "Enter the target directory >" target_dir

find "$source_dir" -type f |
 while IFS= read -r file; do
 folder_date=$(date -d "$(stat -c %y "$file")" +%Y-%m-%d)
 [[ ! -d "$target_dir/$folder_date" ]] && mkdir -p "$target_dir/$folder_date"; 
 mv "$file" "$target_dir/$folder_date"
done

 

간단하다. stat -c %w 가 생선된 날짜를 돌려줘야하지만 리눅스에서는 "-"로 나오기때문에 last modified date으로 폴더를 만든다.

 

다음은 Mac BSD bash script

 

#!/bin/bash
#For MAC OSX Bash
read -p "Enter the source directory >" BASE_DIR
read -p "Enter the target directory >" target_dir

find "$BASE_DIR" -type f |
 while IFS= read -r file; do
    folder_date=$(stat -f "%SB" -t "%Y-%m-%d" "$file")
    [[ ! -d "$target_dir/$folder_date" ]] && mkdir -p "$target_dir/$folder_date"

## Move the file
    mv "$file" "$target_dir/$folder_date"
done

 

대충보면 리눅스와 같아 보이지만 BSD기반이라 stat -c로 파일 정보를 가져올수 없다 대신 더 간단하게 stat -f "%SB" 로 파일의 birthdate을 가져온후 -t option으로 원하는 날짜를 빼내면 된다.