正式なファイルを提出する時に、提出した時点のファイルは残したいですよね。
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
と打つと、ファイルやフォルダを右クリックしたときに「送る」で表示されるものが出てきます。
そこに、下記バッチのショートカットを入れて、ファイル名を
_ファルダ内の日付別表示
としておくと、見たいフォルダを右クリックして、送るから見やすくなるので、便利です。
@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
@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