LoginSignup
2
1

More than 3 years have passed since last update.

dired上で複製ファイルを生成

Last updated at Posted at 2020-08-14

以前出したファイルのデュプリケート・コマンドにマークをつくようにしてみました。
dired でポイントされているファイルのファイル名の日付部分を現在の時間にしてデュプリケートします。
複製されたファイルには dired 上で W マークがつきます。
ファイル名に日付部分が無ければ付け足します。
前の版だと秒の部分がなくて出来立てのファイルだと元の版と衝突してデュプれないとかあったので、秒もつけました。

dup-file-cap.png

自分の場合プログラムの更新をするとき目的のファイルをまずデュプリケートして複製されたものをいじっていき公開する版ではじめて ci して版が更新されます。
公開されるものの間と間にもいくつものマイナー版があったりなかったりです。
そもそもリビジョン・コントローラの類いはこういう雑多な手間を省くことも目的のひとつなんですが、自分の場合目標を実現するためにいくつかの段階を経てそこに到達させる事も多いので、この方が気楽にいじれていいのです。

以下を init.el の中にそのまま入れるか dup-file.el 等として load するようにします。

dup-file.el
(require 'dired)
(require 'dired-aux)
(defvar dup-regexp "[12][0-9][0-9][0-9][01][0-9][0-3][0-9]\\([0-9][0-9]\\)*")
(defvar dup-char   ?W)

(defun dup-date-part-update (file-name &optional date)
  "FILE-NAME  `dup-regexp' が含まれていれば、\
その部分を現在の日付に置き換えた文字列を返す.
含まれていなければノードとエクステンションの間に\
日付を挟んだ文字列を返す.
DATE  non-nil なら日付をその日にする."
  (let* ((node (file-name-sans-extension file-name))
         (ext  (file-name-extension file-name))
         (date (format-time-string
                "%Y%m%d%H%M%S" (or date (current-time))))
         (reg  dup-regexp))
    (if (string-match reg file-name)
        (replace-regexp-in-string reg date file-name)
      (concat node "-" date "." ext))))

(defun dup-file (file &optional date)
  "FILE 名に現在の日付を埋め込んだ複製を作ります.
DATE  non-nil ならタイムスタンプもコピーします."
  (let ((new (dup-date-part-update file date)))
    (if (string-equal file new)
        (error "デュプリケートが同じ名前になる")
      (copy-file file new nil date)
      new)))

;;;###autoload
(defun dired-dup-file (prefix)
  "ポイントのファイルを日付つきの名前にして複製します.
prefix 在りならタイムスタンプもコピーし名前の日付もその日にします."
  (interactive "P")
  (let* ((file (car (dired-get-marked-files)))
         (date (if prefix (nth 5 (file-attributes file)))))
    (dired-add-file (dup-file file date) dup-char)))

;; 任意のキーにバイド
(add-hook 'dired-mode-hook
          (lambda ()
            (define-key dired-mode-map "\C-cd" 'dired-dup-file)))

;; 単独のファイルにする場合は以下もつける
(provide 'dup-file)

Changes

  • Sat Jan 23 10:04:43 2021

prefix をつけて実行するとタイムスタンプも複製され、 生成される日付もそのファイルのタイムスタンプのものになります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1