[2024-09-08 Sun 20:32] 아직 완성 못함 [2024-09-15 Sun 23:40] 리스프로 완성

히스토리

  • [2024-09-10]

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 "%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