이 노트에 대하여
스크린샷 파일 이름에서 날짜와 시간을 추출해 Denote 형식으로 바꾸는 스크립트 로직을 적어 둔다. 반복적인 파일 정리를 자동화해 기록 자산의 일관성을 높이려는 실용 노트다.
BIBLIOGRAPHY
히스토리
아직 완성 못함
리스프로 완성
스크린샷 디렉토리 이름 변경 이맥스 리스프 코드
동작하는 코드는 닷파일 참고
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 "%sT%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))))
#코드
변경조건
2022-10-06_12-13-on-learning-emacs.png -> 20221006T121300-on-learning-emacs.png Screenshot_20221118_115907_ABC EF.jpg -> 20221118T115907—abc-ef.jpg Kyoboebook_20220501-231326.png -> 20220501T231326-kyoboebook.png 20221004-1515-screenshot.png -> 20221004T151500-screenshot.png image_1653277590760_0.png
Comments