[2024-09-08 Sun 20:32] 아직 완성 못함 [2024-09-15 Sun 23:40] 리스프로 완성
히스토리
OKAY 스크린샷 디렉토리 이름 변경 이맥스 리스프 코드
[2024-09-15 Sun 23:41] 동작하는 코드는 닷파일 참고
rename-to-denote-id 함수:
주어진 파일명에서 날짜와 시간을 추출하여 Denote 형식(YYYYMMDDTHHMMSS)으로 변경합니다. 정규 표현식으로 날짜(8자리)와 시간(6자리)을 추출한 뒤, Denote 형식으로 변환한 후 파일명을 변경합니다. rename-all-files-to-denote-id 함수: 지정한 디렉토리 내의 모든 파일을 탐색하여 rename-to-denote-id 함수를 호출합니다. 숨김 파일을 제외하고 처리합니다. 사용법: 이 Lisp 코드를 Emacs에서 실행하거나, init 파일에 추가합니다. M-x rename-all-files-to-denote-id를 실행한 후, 파일이 있는 디렉토리를 선택하면 해당 디렉토리 내 모든 파일이 Denote 형식으로 파일명이 변경됩니다. 예시: bash 코드 복사 Screenshot_20240909_184723_YouTube.jpg → 20240909T184723.jpg 20240908_154742.jpg → 20240908T154742.jpg kyoboebook_20240824-183838.png → 20240824T183838.png image_1653510423179_0.png → 20220525T143023.png (Unix timestamp에서 변환된 예) Screenshot_20240510_080156_KOCW.jpg → 20240510T080156.jpg 추가된 정규 표현식:
;; $[0-9] \\ {8 \\ }$[-_T]?$[0-9] \\ {4 \\ }$ : 20230518-1705 같은 형식을 처리하여 YYYYMMDDTHHMMSS로 변환하며, 4자리 시간(HHMM)이 있으면 초를 00으로 추가합니다.
;; $[0-9] \\ {4 \\ }-[0-9] \\ {2 \\ }-[0-9] \\ {2 \\ }$_$[0-9] \\ {2 \\ }-[0-9] \\ {2 \\ }$ : 2022-10-04_20-04 같은 형식을 처리합니다.
;; $[0-9] \\ {13 \\ }$ : Unix 타임스탬프(예: 1646987682623)를 처리합니다.
추가된 기능 설명:
추가된 정규 표현식:
;; $[0-9] \\ {8 \\ }$[-_T]?$[0-9] \\ {4 \\ }$ : 20230518-1705 같은 형식을 처리하여 YYYYMMDDTHHMMSS로 변환하며, 4자리 시간(HHMM)이 있으면 초를 00으로 추가합니다.
;; $[0-9] \\ {4 \\ }-[0-9] \\ {2 \\ }-[0-9] \\ {2 \\ }$_$[0-9] \\ {2 \\ }-[0-9] \\ {2 \\ }$ : 2022-10-04_20-04 같은 형식을 처리합니다.
;; $[0-9] \\ {13 \\ }$ : Unix 타임스탬프(예: 1646987682623)를 처리합니다.
;; 시간 형식 보완:
;; 초 단위 정보가 없는 경우 HHMM 형식을 HHMMSS로 보완하여 초를 00으로 추가합니다.
;; 시간 정보가 없으면 건너뛰기:
;; 파일에서 날짜 및 시간 정보를 추출하지 못하면 해당 파일을 건너뜁니다.
;; 예시 파일 처리:
;; 20230518-1705-screenshot.png → 20230518T170500.png
;; 20221030-1227.png → 20221030T122700.png
;; 2022-10-04_20-04-which-key-toggle-lists.png → 20221004T200400.png
;; image_1646987682623_0.png → 20220311T094122.png (Unix timestamp 변환)
( defun denote-id-p ( file-name )
"FILE-NAME이 이미 denote ID 형식(YYYYMMDDTHHMMSS)인지 확인."
( string-match-p " \\ `[0-9]\\{8\\}T[0-9]\\{6\\}\\' " ( file-name-base file-name)))
( defun generate-unique-file-name ( directory file-name ext )
"DIRECTORY 내에서 FILE-NAME과 동일한 이름이 있으면 숫자를 증가시켜 고유한 파일명 생성."
( let ((counter 1 )
(new-file-name ( concat file-name "." ext)))
;; 파일이 존재하는지 확인하고, 존재하면 숫자를 증가
( while ( file-exists-p ( expand-file-name new-file-name directory))
( setq new-file-name ( format " %s - %d . %s " file-name counter ext) )
( setq counter ( 1+ counter)))
new-file-name))
( defun rename-to-denote-id ( file-name )
"FILE-NAME에서 날짜와 시간을 추출해 denote 형식으로 파일명을 변경.
denote ID 형식의 파일명은 건너뜀. 중복 파일명이 있으면 숫자를 증가시킴."
( let* ((base-name ( file-name-base file-name))
(ext ( file-name-extension file-name))
(directory ( file-name-directory file-name))
;; 날짜와 시간을 추출하는 여러 정규 표현식 (다양한 형식 대응)
(date-time-regex-list
'( "$[0-9] \\ {8 \\ }$[-_T]?$[0-9] \\ {6 \\ }$?" ;; YYYYMMDD-HHMMSS
"$[0-9] \\ {8 \\ }$[-_T]?$[0-9] \\ {4 \\ }$" ;; YYYYMMDD-HHMM
"$[0-9] \\ {4 \\ }-[0-9] \\ {2 \\ }-[0-9] \\ {2 \\ }$_$[0-9] \\ {2 \\ }-[0-9] \\ {2 \\ }$" ;; YYYY-MM-DD_HH-MM
"$[0-9] \\ {13 \\ }$" ;; Unix timestamp
"Pasted image $[0-9] \\ {8 \\ }$$[0-9] \\ {6 \\ }$" ;; Pasted image YYYYMMDDHHMMSS
))
new-file-name)
;; denote 형식인 파일은 건너뜀
( if (denote-id-p base-name)
( message "File %s is already in denote format, skipping." file-name)
;; 날짜 및 시간 추출 시도
( catch 'done
( dolist (regex date-time-regex-list)
( when ( string-match regex base-name)
( let ((date ( replace-regexp-in-string "-" "" ( match-string 1 base-name)))
(time ( match-string 2 base-name)))
;; 시간 형식이 없으면 기본값 "000000" 또는 "0000"일 경우에 "0000" -> "000000"으로 변환
( setq time ( cond
(( not time) "000000" ) ;; 시간 없으면 000000
(( = ( length time) 4 ) ( concat time "00" )) ;; HHMM -> HHMMSS 변환
( t time)))
;; 새로운 파일명 작성 (denote 형식)
( setq new-file-name ( format " %s T %s " date time) )
;; 동일한 파일명이 있는 경우 고유한 파일명 생성
( setq new-file-name (generate-unique-file-name directory new-file-name ext))
;; 파일명 변경
( rename-file file-name ( expand-file-name new-file-name directory))
( message "Renamed %s to %s " file-name new-file-name)
( throw 'done t )))))
( message "No valid date-time found in %s " file-name) ))))
( defun rename-all-files-to-denote-id ( directory )
"DIRECTORY 내의 모든 JPG, PNG, GIF 파일을 Denote 형식으로 파일명 변경.
이미 denote 형식인 파일은 건너뛰며, 날짜/시간이 없으면 처리하지 않음."
( interactive "DDirectory: " )
( dolist (file ( directory-files directory t "^[^.].*" )) ;; 숨김 파일 제외
( when ( and ( file-regular-p file)
( member ( file-name-extension file) '( "jpg" "png" "gif" )))
(rename-to-denote-id file))))
KILL #코드
변경조건
대화
Related-Notes
References