同一拡張子のファイルを一つのまとめたい
業務でDDLの差分チェックを任されたのですが、一方が一つのSQLファイルにまとまっているのに対し、もう一方は1テーブルにつき1ファイルで作成されていました。
テーブルは全部で200個以上あり、このままの状態で差分比較をするのは現実的でなかったので、後者を一つのファイルにまとめるスクリプトを作成しました。
実行環境
- Windows 11
1. スクリプトの作成
下記スクリプトを適当なファイルパスに作成します。
concatFiles.bat
@echo off
setlocal
rem 1.
rem 出力元フォルダ
set "SOURCE_DIR=C:\Users\dev\sql"
rem 出力先フォルダ
set "OUTPUT_DIR=C:\Users\dev\sql\concat"
rem 出力ファイル名
set "OUTPUT_FILE=combined.sql"
rem 2.
rem 出力ファイルがすでに存在する場合は削除
if exist "%OUTPUT_DIR%\%OUTPUT_FILE%" del "%OUTPUT_DIR%\%OUTPUT_FILE%"
rem 3.
rem 指定したディレクトリ内のすべての.sqlファイルを結合
for /f "delims=" %%f in ('dir /b /on "%SOURCE_DIR%\*.sql"') do (
type "%%f" >> "%OUTPUT_DIR%\%OUTPUT_FILE%"
echo. >> "%OUTPUT_DIR%\%OUTPUT_FILE%"
echo. >> "%OUTPUT_DIR%\%OUTPUT_FILE%"
)
)
echo 結合が完了しました: %OUTPUT_DIR%\%OUTPUT_FILE%
pause
endlocal
解説
- 出力元フォルダ、出力先フォルダ、ファイル名を指定します。
もし実行時にそれらを指定したい場合は、以下のように引数を使う形に変更可能です。.batset "SOURCE_DIR=%1" set "OUTPUT_DIR=%2" set "OUTPUT_FILE=%3"
2.
if exist
コマンドで、同名のファイルがすでに存在する場合は、そのファイルを削除します。
これにより、古い内容が残った状態で上書きされるのを防ぎます。
3.
-
for /f "delims=" %%f in ('dir /b /on "%SOURCE_DIR%\*.sql"')
指定されたディレクトリ内にあるすべての .sql ファイルを取得し、ファイル名を昇順に並べます。 -
/b
はファイル名のみを表示し、/on
でファイル名を昇順にソートします。 - 各ファイルを type コマンドで読み込み、出力ファイル
%OUTPUT_FILE%
に追加します。 -
echo.
を2回実行して、ファイル間に2行の空行を挿入し、視覚的な区切りをつけています。
この区切りにより、結合された各テーブルの間がはっきりとわかるようになります。不要な場合は削除してください。
2. 実行方法
エクスプローラーからバッチファイルをダブルクリックで実行できます。
または、コマンドプロンプトを開き、バッチファイルのファイルパスを入力して実行します。
C:\Users\dev> C:\Users\dev\pj\bat\concatFiles.bat
フォルダやファイル名を引数指定にした場合は、以下のようにして実行します。
C:\Users\dev> C:\Users\dev\pj\bat\concatFiles.bat "C:\Users\dev\sql" "C:\Users\dev\sql\concat" "combined.sql"
3. 実行結果
結合前のファイル
結合ファイル
ひとつのファイルにまとまりました。間に空行が入っています。