#스크린샷 #이름일괄변경 #스크립트
#스크린샷 #이름일괄변경 #스크립트
2024-09-08 Note notes rename screenshot scripts아직 완성 못함 리스프로 완성
히스토리
- [2024-09-10]
OKAY 스크린샷 디렉토리 이름 변경 이맥스 리스프 코드
동작하는 코드는 닷파일 참고
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))))
KILL #코드
변경조건
대화
Related-Notes
References
마지막 수정일자