0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ファイル管理支援ツール(ファイル名の日付でグルーピングして表示するバッチ)

Last updated at Posted at 2024-09-18

正式なファイルを提出する時に、提出した時点のファイルは残したいですよね。

windowsのファイルシステムって、機能が貧弱なのですが、ファイル名の工夫でその保管方法を改善しました。

ファイルを提出日の日付のフォルダで整理してませんか?

フォルダ20240405
---XX殿向けXXシステム概要提案.xlsx

フォルダ20240618
---XX殿向けXXシステム仕様書.xlsx
---XX殿向けXXシステムマニュアル.xlsx

フォルダ20240918
---XX殿向けXXシステム仕様書_v2.xlsx
---XX殿向けXXシステムマニュアル_v2.xlsx

こんな感じ。

これをやると、後で見ようとしたときに、提出日が分からないファイルは、どのフォルダに入れたのか探すのがめっちゃ大変です。また、引継ぎをするにも、一覧性が低く、全体把握が難しい。
そもそも、どれが探しているドキュメントの最終提出物なのかもわからない。
しかも、ファイル検索も使い勝手が悪く、あまり当てにできない。

ファイル名の頭の部分に提出日を入れて整理してみた。

そこで、日別のフォルダ分けをやめて、ファイル名の頭の部分に日付を入れることで、それを使ってソート表示したりしてました。
これで、一覧性は飛躍的に向上します。
全てのファイルが、提出日順に表示できるので、経緯は分かりやすくなる。

しかーし!

日付別のフォルダよりは、ましになりますが、これって、同一ファイルの更新をしたときに、他のファイルが間に挟まって、バラバラになってしまい、相変わらず、最新版の管理としては分かり難いままです。

20240405XX殿向けXXシステム概要提案.xlsx
20240615XX殿向けXXシステム仕様書.xlsx
20240615XX殿向けXXシステムマニュアル.xlsx
20240918XX殿向けXXシステム仕様書_v2.xlsx
20240918XX殿向けXXシステムマニュアル_v2.xlsx

こんな感じ。

そこで、ファイル名の後ろに日付を入れることにしました。

こうすれば、
XX殿向けXXシステム概要提案_20240405.xlsx
XX殿向けXXシステムマニュアル_20240618.xlsx
XX殿向けXXシステムマニュアル_v2_20240918.xlsx
XX殿向けXXシステム仕様書_20240618.xlsx
XX殿向けXXシステム仕様書_v2_20240918.xlsx
みたいな感じで、同じ用途のファイルが続けて表示されるので、どれが最新版かもすぐわかる!

ファイルが種類別に整理出来ていて、それぞれの種類が提出順に並ぶ。

予は満足じゃ!(^^♪

問題は解決したが

・一覧性の向上により、ファイルが見つけやすく、引継ぎもしやすい。
・最新ファイルをパッと見て分かる。
というフォルダ別保存での問題点は、これによって解決しました。

しかし、人間は欲深いもので
「提出日毎にどのファイルを同時に提出したのか?」
はフォルダ別の方が分かりやすかった。
という声もあります。

そこで登場するのは「ファイル名の日付でグルーピングして表示するバッチ」

です。

これがあれば、
「提出日毎にどのファイルを同時に提出したのか?」
という、滅多にないニーズに応える事が出来ます。

単純なバッチなので、解説は特にしませんが、使い方は、
「提出日毎にどのファイルを同時に提出したのか?」を解析したいフォルダをドラッグ&ドロップでこのバッチに重ねてください。

フォルダは参照するだけなので、実害はありませんが、ファイル名の最後に日付をYYYYMMDDで入れておいてください。

また、バッチ中にある設定を変えれば、日付+固定長のバージョン番号も入れたい!というニーズにも対応します。

※2024/9/27少し修正しました。
また、既存のYYYYMMDDフォルダに分けて保存している構造を、後ろに_YYYYMMDDと変換するバッチも作成しましたので、それも掲載しておきます。

ちなみに、windowsキー+rで表示されたところに
shell:sendto
と打つと、ファイルやフォルダを右クリックしたときに「送る」で表示されるものが出てきます。
そこに、下記バッチのショートカットを入れて、ファイル名を
_ファルダ内の日付別表示
としておくと、見たいフォルダを右クリックして、送るから見やすくなるので、便利です。

datesort.bat
@echo off
setlocal enabledelayedexpansion

rem 以下の2つの変数は、用途に合わせて変更ください。

rem 1.バージョン表記の設定
rem ファイル名の最後を日付+固定長バージョンとしたい場合は、バージョンの固定長をセットください。
rem ファイル名にバージョンを含まない場合は、0としてください。
set version_length=0

rem 2.ワークファイルの削除
rem ワークファイルを削除したい場合は、以下をYESにしてください。
set work_file_delete=NO

rem 以下は基本的に修正しないでください。

rem ドラッグ&ドロップされたフォルダを取得
set "folderPath=%~1"

rem 各変数初期設定
set file_count=0
set illegal_date=NO
set correct_date=00000101
set /A date_work_lengh=8+%version_length%
set "tempFile=%temp%\temp_grouping.txt"

rem フォルダがドラッグ&ドロップされたかチェック
if "%folderPath%"=="" (
    if %version_length%==0 (
    echo このバッチはファイル名の最後をYYYYMMDDとして、日付別にグルーピングして表示します。
    echo.
    echo ※ファイル名の最後がYYYYMMDDでない場合は、日付を%correct_date%として処理します。
    echo.
    ) else (
    echo このバッチはファイル名の最後をYYYYMMDD+%version_length%桁のバージョン表記として、日付別にグルーピングして表示します。
    echo.
    echo ※ファイル名の最後がYYYYMMDD+%version_length%桁のバージョン表記でない場合は、日付を%correct_date%として処理します。
    echo.
    )
    echo フォルダをこのバッチファイルにドラッグ&ドロップしてください。
    echo.
    pause
    exit /b
)

rem 一時ファイルが残っていたら削除
if exist %tempFile% del %tempFile%

rem フォルダ内のファイルをループ
for /f "delims=" %%F in ('dir /b "%folderPath%"') do (
    set /A file_count=!file_count!+1
    set "fileName=%%~nF"
    rem ファイル名の後ろ8文字+バージョン分を抽出
    set "datePart=!fileName:~-%date_work_lengh%!"
    rem 日付部分のみ取り出し
    set "datePart=!datePart:~0,8!"
    rem ファイル名の最後の8文字が数字でないものは、%correct_date%として処理する。
    for /F "delims=0123456789" %%A in ("!datePart!") do (
        set illegal_date=YES
        set "datePart=%correct_date%"
    )
    rem 一時ファイルに書き込み
    echo !datePart! %%~nxF >> %tempFile%
)

rem グルーピングして表示
set "prevDate="
for /f "tokens=1,* delims= " %%A in ('sort %tempFile%') do (
    if not "!prevDate!"=="%%A" (
        REM 部分文字列を使って年月日を分割
        set date=%%A
        set "year=!date:~0,4!"
        set "month=!date:~4,2!"
        set "day=!date:~6,2!"
        echo.
        echo [日付: !year!/!month!/!day!]
        set "prevDate=%%A"
    )
    echo     %%B
)

echo ====================================================================================
echo.
echo.
echo.
echo.
rem echo [%folderPath%]フォルダーには、[%file_count%]個のファイルが見つかりました。
rem echo [%file_count%]個のファイルが見つかりました。
echo.

if "%work_file_delete%"=="NO" echo 上記一覧は[%tempFile%]に残しています。
rem if %illegal_date%==YES echo ファイル名のYYYYMMDDが規則通りでないファイルが見つかりました。このファイルの日付は%correct_date%としました。
echo.

rem 一時ファイルを削除
if not "%work_file_delete%"=="NO" del %tempFile%

endlocal
pause

:end

save_with_date.bat
@echo off
setlocal enabledelayedexpansion

REM 元フォルダと移動先フォルダを指定してください
set "source_Folder=%~1
set "destination_Folder=%source_Folder%_converted"

REM destination_Folderを作成
if not exist "%destination_Folder%" mkdir "%destination_Folder%"

REM source_Folder内のサブフォルダをループ処理
for /d %%D in ("%source_Folder%\*") do (
    REM フォルダ名を取得
    set "folder_name=%%~nxD"

    REM フォルダ名の最初の8文字を取得
    set "date_prefix=!folder_name:~0,8!"

    REM サブフォルダ内のファイルやフォルダをループ処理
    for /f "delims=" %%F in ('dir /b "%%D"') do (
        rem echo "%F"="%F"
        rem echo "%%F"="%%F"
        
        if exist "%%D\%%F\" (
        REM フォルダ
        set "file_name=%%~nxF"
        set "new_name=!file_name!_!date_prefix!"
        
        REM リネームしてdestination_Folderに移動
        rem echo    move "%%F" "%destination_Folder%\!new_name!"
        robocopy "%%D\%%F" "%destination_Folder%\!new_name!" /E
        ) else (
        REM ファイル
        set "file_name_base=%%~nF"
        set "file_name_ext=%%~xF"
        rem %~nx0	ベースネーム + 拡張子	sample.bat
        rem %~n0	ベースネーム	sample
        rem %~x0	拡張子	.bat
        REM 新しいファイル名を設定
        set "new_name=!file_name_base!_!date_prefix!!file_name_ext!"
        
        REM リネームしてdestination_Folderに移動
        rem echo    move "%%F" "%destination_Folder%\!new_name!"
        copy "%%D\%%F" "%destination_Folder%\!new_name!"
        )
    )
)

echo 処理が完了しました。
pause

:end
0
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?