プログラミング勉強日記ではない日記

じゃあ何かっていうとただの日記です

【Ruby】カレントディレクトリ配下のファイルを年月フォルダに移動【写真整理】

写真を整理したい

過去、貯めに貯めた写真ファイル。

行き当たりばったりに保管してきたのでフォルダも汚い。

カメラのメーカーごとに命名もバラバラ。

そこで、時系列に整理したいと思い、やってみました。

shellでやったりJavaでやったりしましたが、Rubyが作りやすかったです。

ソースコード

require 'fileutils'

#-------------------------------------------------
# カレント配下のファイル※1に対し以下を行う
#   * ファイル名変更 yymmdd_HHMMSS_連番.jpg ※2
#   * pic/年月フォルダへ移動
#
# ※1 jpg, jpeg, JPG
# ※2 連番はファイル名がかぶっている場合に振る
#-------------------------------------------------

# TODO 別フォルダに移動したり、
#      ゴミフォルダは削除するなど

cur = Dir.pwd + '/'
i = 0 # 連番用
j = 0 # 連番用
# not_jpg = Array.new # jpg以外のリスト

# 画像の移動先フォルダを作成
if !Dir.exist?('pic')
  Dir.mkdir('pic')
end

# 画像以外の移動先フォルダを作成
if !Dir.exist?('other')
  Dir.mkdir('other')
end


#-------------------------------------------------
# ファイル名を変更しpic/年月へ移動
#-------------------------------------------------

# カレント以下を再帰的に処理
Dir.glob('./**/*').each do |f|

  ext = File.extname(f) # 拡張子取得

  # 画像
  if ext == '.JPG' || ext == '.jpg' || ext == '.JPEG' || ext == '.jpeg'

    # 移動先ディレクトリ作成
    to_dir_name = cur + '/pic/' + File.mtime(f).strftime('%y%m')
    if !Dir.exist?(to_dir_name)
      Dir.mkdir(to_dir_name)
    end

    # 変更名を作成
    new_name = to_dir_name + '/IMG_' + File.mtime(f).strftime('%y%m%d_%H%M%S') + ext
    if File.exist?(new_name)
      # 移動先に存在する場合、連番を振る
      i +=1
      new_name = to_dir_name + '/IMG_' + File.mtime(f).strftime('%y%m%d_%H%M%S') + '_' + i.to_s + ext
    end

  # 画像以外
  else
    # 移動先ディレクトリ作成
    to_dir_name = cur + '/other'
    # 変更名を作成
    new_name = to_dir_name + '/' + File.mtime(f).strftime('%y%m%d_%H%M%S') + ext
    if File.exist?(new_name)
      j +=1
      # 移動先に存在する場合、連番を振る
      new_name = to_dir_name + '/' + File.mtime(f).strftime('%y%m%d_%H%M%S') + '_' + j.to_s + ext
    end
    # not_jpg.push(f)
  end

  # 移動
  if FileTest.file? f
    if File.basename(f) == 'move_files.rb'
    else
      # カレントディレクトリを変更(ブロックを抜けると戻る)
      FileUtils.chdir(File.dirname(f)) {
        # ファイルを移動
        File.rename(File.basename(f), new_name)
      }
    end
  end

end

puts '--------------------'
puts 'done.'
puts '--------------------'

# puts '--------------------'
# puts 'not_jpg_list'
# puts '--------------------'
# puts not_jpg

GitHub

github.com

【bat】サブディレクトリのファイルを全てカレントに移動(ついでにリネーム)する方法【コマンドプロンプト】

サブディレクトリのファイルを全てカレントに移動する方法

注意

以下では移動ついでリネームしています。

(ファイル名をYYMMDD_HHMM.JPGに)

これは、将来的には過去のファイルを時系列で整理したいという個人的な理由からです。

ですので、単純にサブディレクトリのファイルを全てカレントに移動したいだけの場合は端折って考えていただければと思います。

環境

Windows10のbatを使います。

ソースコード

@echo off
setlocal ENABLEDELAYEDEXPANSION

set TODIR=%~dp0
set num=0

for /r "%TODIR%" %%i in (*.JPG) do (

  rem ファイル名編集
  set update=%%~ti
  set y=!update:~2,2!
  set m=!update:~5,2!
  set d=!update:~8,2!
  set h=!update:~11,2!
  set mi=!update:~14,2!
  set ymd_hm=!y!!m!!d!_!h!!mi!

  rem 現在ディレクトリで重複チェック
  set cur=%%~pi
  if EXIST !cur!!ymd_hm!.JPG (
    set /a num+=1
    set wk_name=!ymd_hm!_!num!
  ) else (
    set wk_name=!ymd_hm!
  )

  rem 移動先ファイル名の重複チェック
  if EXIST %TODIR%!wk_name!.JPG (
    set /a num+=1
    set new_name=!wk_name!_!num!.JPG
  ) else (
    set new_name=!wk_name!.JPG
  )

  rem カレントへ移動
  ren %%i !new_name!
  move !cur!!new_name! %TODIR%
)
pause

ファイル名をYYMMDD_HHMMにすると重複もありえるのでチェックし連番ふってます。

結果

なんということでしょう!

匠の手によってありがちな殺風景なディレクトリが、使いやすい空間へと生まれ変わりました。

Before

C:.
│  bef.txt
│  IMG_7049.JPG
│  move.bat
│  
└─sub
    │  IMG_6918.JPG
    │  IMG_6919.JPG
    │  IMG_6922.JPG
    │  IMG_6923.JPG
    │  
    ├─201907
    │      IMG_6282.JPG
    │      IMG_6582.JPG
    │      IMG_6583.JPG
    │      
    └─201911
            IMG_6918.JPG
            IMG_6919.JPG
            IMG_6922.JPG
            IMG_6923.JPG

After

C:.
│  190713_1600.JPG
│  190812_1339.JPG
│  190812_1339_3.JPG
│  191102_1104.JPG
│  191102_1104_1.JPG
│  191102_1104_4.JPG
│  191102_1104_5.JPG
│  191102_1107.JPG
│  191102_1107_2.JPG
│  191102_1107_6.JPG
│  191102_1107_7.JPG
│  191208_0839.JPG
│  bef.txt
│  move.bat
│  
└─sub
    ├─201907
    └─201911

これをベースに使いやすいように如何様にも料理できますね!

【COBOL】LOW-VALUEとSPACEとZEROをヘキサで見る

LOW-VALUEとかZEROをヘキサで見たかったのですが、

DISPLAYでヘキサ表示が無理なのでファイルに書いてバイナリエディタで見ることに。

LOW-VALUEとSPACEとZEROの姿をこの目でみる

違うのは分かってるんですけど実際違うところ見たいじゃないですか。

結論

  • LOW-VALUE:00
  • SPACE:20
  • '0':30
  • ZERO:30

実験結果

環境

  • Ubuntu 18.04.3 LTS
  • cobc (OpenCOBOL) 1.1.0

ソースコード

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST_DATA.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
         SELECT F1 ASSIGN TO "F1.dat".
       DATA DIVISION.
       FILE SECTION.
       FD F1.
         01 F1RC.
      *    文字
           03 STR                       PIC X(4).
      *    符号なし数字4桁
           03 NM                        PIC 9(4).
      *    符号つき数字4桁(3+符号)
           03 NM_S4                     PIC S9(4).
      *    符号つき数字4桁(バイナリ)2バイト
           03 NM_4B                     PIC S9(4) COMP.
      *    符号つき数字9桁(バイナリ)4バイト
           03 NM_9B                     PIC S9(9) COMP.
      *    符号つき数字3桁(パックデシマル)2バイト
      *    567 -> 56 7+
           03 NM_3C3                    PIC S9(3) COMP-3.
      *    符号つき数字4桁(パックデシマル)3バイト
      *    5678 -> 05 67 8+
           03 NM_4C3                    PIC S9(4) COMP-3.
         WORKING-STORAGE SECTION.
       PROCEDURE DIVISION.
         MAIN-S.
      *
           OPEN OUTPUT F1.
      * -- LOW-VALUE --
           MOVE LOW-VALUE               TO F1RC.
           MOVE 'LOWV'                  TO STR.
           WRITE F1RC.
           MOVE LOW-VALUE               TO F1RC.
           WRITE F1RC.
      * -- SPACE --
           MOVE LOW-VALUE               TO F1RC.
           MOVE 'SPCE'                  TO STR.
           WRITE F1RC.
           MOVE SPACE                   TO F1RC.
           WRITE F1RC.
      * -- ALL'0' --
           MOVE LOW-VALUE               TO F1RC.
           MOVE 'ALL0'                  TO STR.
           WRITE F1RC.
           MOVE ALL'0'                  TO F1RC.
           WRITE F1RC.
      * -- ZERO --
           MOVE LOW-VALUE               TO F1RC.
           MOVE 'ZERO'                  TO STR.
           WRITE F1RC.
           MOVE ZERO                    TO F1RC.
           WRITE F1RC.
      *
           CLOSE F1.
      *
           STOP RUN.
         MAIN-E.

バイナリエディタで表示

f:id:mhaya18:20191221123439p:plain

実際の姿を目で見ました。

LOW-VALUEとはヘキサで00なんですね。

--

ここから広告