一括表示

− 野ざらし言 −

[2462] 選択ファイルのタイムスタンプ一括変更

めざら 2008/01/25(Fri) 23:09
<mezala@nifty.com> http://homepage3.nifty.com/mezala/
 最近作成したうちのひとつです。
 作った動機はいまひとつ不純な感じ。

----------^ SETFTIME.DEF ( date:2008-01-25 time:00:10 ) ----< cut here
= setftime v0.10 = by H_ear
#if 0
ファイラーで選択したファイルのタイムスタンプを指定一定間隔に変更
使用目的:複数のファイルのタイムスタンプを同一にしたり,
ファイラーでの配列順に作成日時を意図した一定間隔にずらして
整理しやすくするために使用する。
1 起動後に月日,初期時刻,時刻増分を問い合わせに従って入力する
 それぞれの入力窓では[CR]のみで初期値(当日の00:00で1分間隔)が入力される
2 自動的に起動されたファイラーで対象となるファイルを選択する
 処理の順はソート順となるので意図的な配列を行っておくことが必要
3 ファイル選択マークを付けたら[CR]で実行する
#endif
* mad for vz!
1 ^\ "" ?.
        ax=$2A00, &i($21) y=cx, i=m=dx>>8, d=dx&$ff,    ;初期値の取得
 :a     ; ---- 月日入力 ---- 4桁でデリミタ不要,[CR]で当日
        &g("月日? [0000] [CR]=本日") &Cr
        (r+2)??>b                       ;[CR]:Today
        (r+1)??{ (0) >z }               ;[ESC]:Cancel
        (r<101 || r>1231)?{ &m("日付を再入力してください.") >a }
        m=r/100, d=r%100, (d)??d+,      ;日が0なら修正
        (i-m>6)?y++, (m-i>6)?y--,       ;前後半年間
        r" $(1F,1C,1F,1E,1F,1E,1F,1F,1E,1F,1E,1F)",     ;from calendar.def(__)
        (y%4 || y%100==0 && y%400)?r.2=28, ?r.2=29,
        (r.m<d)?d=r.m,                  ;不正な日付を許容しない
 :b     ; ---- 時刻入力 ---- 4桁でデリミタ不要,[CR]で 00:00
        &g("時刻? [0000] [CR]=00:00") &Cr
        (r+2)??r0,                      ;[CR]:00:00
        (r+1)??{ (0) >z }               ;[ESC]:Cancel
        (r<0 || r>2359)?{ &m("開始時刻を再入力してください.") >b }
        h=r/100, f=r%100, (f>59)?f-,    ;不正な数値は丸める
 :c     ; ---- 時刻間隔入力 ---- 基本は[CR]で1分,0ですべて同じ
        &g("間隔? [CR]=1分") &Cr
        (r+2)??r1,                      ;[CR]: 1分間隔が初期値
        (r+1)??{ (0) >z }               ;[ESC]:Cancel
        (r<0 || r>59)?>c                ;負数,1時間以上は許容しない
        j=r,
        &Fl(fl+34) &Cr (r)?{ (0) >z }   ;&Fl()で起動したファイラーで
        ;&Fi                            ;&Fiを実行すると先頭ファイルを無視
        i+,
 :l     ; ---- main loop ----
        &Fg(pr,1)                       ;get path
        &m("%d %s",i,pr)                ;編集画面で処理状況を通知
        ax=$3D00, dx=pr, &i($21)        ;open file handle
        bx=ax,                          ;handle no. 続くFCALLの引数に使用する
        cx=h<<11|f<<5,                  ;指定時刻(秒は0)
        dx=(y-1980)<<9|m<<5|d,          ;指定年月日
        ax=$5701, &i($21)               ;set time
        ax=$3E00, &i($21)               ;close file handle
        i++, f+=j,
        (f>60)?{ f=f%60, h=h++%24, }    ;日付までは影響を及ぼさない(ださ)
        &Fn (r)?>l ;(1)                 ;処理ファイルが残る間は繰り返す

 :z     ; ---- exit ----
        ?&m("done.") ?&m("cancel.")
        &d #] .
*

[Variables]
        i       counter/(月の一時保存に流用している)
        y,m,d   year/month/day
        h,f     hour/minute
        j       interval(min.)
[Buffers]
        pr      get fname
[History]
2008/01/25 0.10 初版
[Notes]
&Fl()で起動したファイラー選択の後,&Fi を実行すると,先頭ファイルが無視される。
上村氏の insfile.def にその情報は既出だった。
このマクロを作成するきっかけは,投稿動画サイトのキャッシュを保存する場合に,
リストファイルに基づいてファイル名を変更するマクロを作成したところ,
回線の状況によってダウンロード時間が前後する場合があるとファイル名と中身が
入れ替わってしまうというケースがあったからだった。ファイル名を順次変更する
場合にファイル名でソートしておくわけにはいかないので,タイムスタンプを一括で,
かつ時間をずらして変更しておく必要があった。必要こそマクロの母である。
なお,このマクロは配布用の複数のファイルのタイムスタンプを版番号などに統一する
用途にも使える。
----------$ SETFTIME.DEF ( lines:76 ) ----------------------< cut here

[2465] リストでファイル名を一括変更

めざら 2008/01/26(Sat) 15:19
[2462]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
上の setftime.def を必要とした理由は,次のマクロでファイル名を一括変更
しようとした時にタイムスタンプがコントロールされていると便利だったから。

リストに従って,拡張子ごと改名する結構危険なマクロなので,取扱注意です。

----------^ LISTREN.DEF ( date:2008-01-13 time:00:16 ) -----< cut here
= listren.def v0.16 = by H_ear
#if 0
リストリネーム:リストファイルに従い対象ディレクトリのファイルをリネーム
写真や動画投稿サイト等のキャッシュをまとめて改名するのに使用する
・リストファイルの作成を前提とする
 対象ファイルの拡張子を保存することもしないので,拡張子を付与したリストが必要
・リストファイルの拡張子は .lst に限定
・長いファイル名が使用できる環境(高橋版+WinDos窓)での使用を想定
・起動後にファイラーで選択した並び順にリネームするが F E 無効
・対象ディレクトリは pi下の @DIR で指定(末尾に\必要)
・ファイル名に使用できない文字は最低限のチェックしかしていない
 大事なファイルのあるディレクトリなどで不用意に実行すると非常に危険なので,
必ずファイルを特定ディレクトリに複写したうえで実行することが必要。取扱注意。
#endif
* mad for vz!
1 ^\ "" ?.
        ; ---- バッファを lbuf に確保 ----
        #] p=wm+330,                    ;safety: lbuf+100
        p..-1=bl-100,                   ;Size: bl-100
        ; ---- check ext ----
        &Sc(p,wa+146)                   ;#0.16 拡張子照合
        &Sy(p) &Sx(cx,".lst")
        (r)?{ &m("リストファイルで起動してください.") . }

        ; ---- 設定開始 ----
        cc="$"*+,/:;<=>?[\]|",          ;DOSファイル名に使えない文字一覧(15)
;;      d="a:\vz\tmp\",                 ;@DIR
        d="tmp\",                       ;piディレクトリ下に存在する必要
        ; ---- 設定終了 ----

        ; ---- リストファイルから取得 ----
        mp[, ps[=p, f-,                 ;#G -> p(as ps)
        #_ #>                           ;後ろからバッファに格納
 :e     (lx+lh)??{ #s (r)?>f >e }       ;空行はスキップ
        mb-, mp-, &s #b #< #G f++, &d   ;行取得・ps(p)格納
        (mp)??{ &m("取得作業に異常. 確認してください.") >z }
        i-,
 :c     c=cc.i, &> (i++<15)?>c          ;ファイル名をチェック/禁止文字->'_'
        #s (r)??>e                      ;ファイルの先頭に到達したら取得終了

        ; ---- ファイラー ----
        FS[,                            ;
;; :f   #O &?("%s",d) #m                ;ノーマルにファイラーを起動
 :f     #O &?("%s%s",pi,d) #m           ;pi/d
        (s==4)?'N'                      ;DIR指定の末尾\がない場合
        (s-3)?{ :d #[ (s)??>d >z }      ;ディレクトリが存在しない場合
;;      (fl..7!=f+1)?{ &m("ファイル数異常. 確認してください.") >q }

        ; ---- 確認処理 ----
 :s     #S :m (s==4)?{ &c >m }          ;#0.12 ソート条件確認
        (FS&3)?{ &m(40) >s }            ;#0.15 ファイル名・拡張子順は処理しない
        &a("実行します") (r<1)?>q       ;#0.13 実行確認
        &a("本当に実行します") (r<1)?>q ;#0.14 重ねて実行確認

        #^ i-,                          ;ファイラー先頭は ..\ <DIR>
 :l     ; ---- main loop ----
        #x #R                           ;リネーム窓が開かなければ異常
        (s!=1)?{ &m("ファイル数異常. 確認してください.") >q }
        #x &?("%s",p) #m                ;現ファイル名をキャンセルして改名
        &Sn(p) p+=r+1,                  ;次の文字列へポインタを移動
        (i++<f)?>l                      ;ストックがあれば繰り返す

 :q     ; ---- quit ----
        #[ (s)?>q                       ;編集画面に戻る
        FS],

        (i==f)?{
                &m("正常に終了しました.")
        }?{
                &m("処理数に相違があります.")
        }

 :z     ; ---- exit ----
        ps], mp],
        &d #] .

00:     ; ---- check filename ----
        ; ファイル名に使えない文字を'_'に置換
        ; --> cc.i : char
        r=ps, :d &SF(r,c) (r)?{ r.0='_', >d }
*
[Variables]
        c,cc    char,list str
        p       ptr
        d       Dir
        f       list items;取得行数(改名ファイル数)
        i       counter;reuse
[Buffers]
        p=lbuf  as ps
        pr      rename buf.
[History]
2008/01/08 0.10 初版
2008/01/09 0.11 重複ラベルによる無限ループがあった
2008/01/10 0.12 ソート条件確認(処理ディレクトリ等の確認もできる)
2008/01/10 0.13 実行確認ルーチン追加(ファイラーでキャンセル可能とする)
2008/01/11 0.14 しつこい実行確認(危険なマクロであることを改めて認識のため)
2008/01/12 0.15 ソートにファイル名・拡張子順を選択させない
2008/01/13 0.16 リストファイルの拡張子検査と#S後のカーソル位置を調整
[Notes]
ラインバッファにpsヒストリバッファを作って文字列を容易に取得する例
ファイル名検査がもう少し何とかならんものかと思う
Windowsのcommand promptではlf+でも60文字以上のファイル名にはならずスキップ
カレントディレクトリ対象など便利にすると危険なので @DIR 指定は必須がよい
ファイラーコマンド#S:ソートメニュー実行直後はカーソルがファイル上に動く
----------$ LISTREN.DEF ( lines:104 ) ----------------------< cut here

 ひどくローテクなのですが,しばらく前に考えたラインバッファにpsを
作って文字列を取り込んでおく技術を使ってみたかったというだけかも。

↑ このページの先頭