Windowsのtarコマンドで tar.gzファイルをtarファイルにする

NonStopServerではtarコマンドの-zオプション（compress/uncompress with gzip）、gunzipが使えないため、Windowsでtar.gzファイルをtarファイルにする手順とバッチ。

ごくたまにしか実施しないので、自分のための覚書。


# 前提など

7-zipなどのツールを使ってtarにすることも可能ですが、
Windows10の標準機能の範囲でできる方法で。


tar.gzを一度展開し無圧縮tarファイルを作成しています。


## 動作確認環境

　Windows 10 Pro  21H2 19044.2006
　Windows 10 Home 21H2 19044.2006

　PSVersion : 5.1.19041.1682

　tarのバージョン：bsdtar 3.5.2 - libarchive 3.5.2 zlib/1.2.5.f-ipp


# コマンドでtar.gz を tar にする

## tarコマンド

```:tar.gz 展開
tar xzf archive.tar.gz
```

```:tar 作成
tar cf archive.tar [files ... ]
```


## コマンドプロンプトでの実施


処理対象のtar.gzファイルは、カレントディレクトリにある archive.tar.gz の前提。

カレントディレクトリに展開されるため、アーカイブファイルの配置ディレクトリとは別に作業ディレクトリを作成して作業ディレクトリに展開。
作業ディレクトリ内の全ファイルを再アーカイブしている。

```bat
rem ファイル確認
dir /b archive*

rem 以下が存在する前提
rem archive.tar

rem 作業ディレクトリ作成
mkdir archive_tmp

cd archive_tmp

rem tar.gz 展開
tar xzf ../archive.tar.gz

rem tar 作成
tar cf ../archive.tar *

cd ..

rem ファイル確認
dir /b archive*

rem 以下が存在する
rem archive.tar
rem archive.tar.gz
rem archive_tmp

rem 作業ディレクトリ（と展開したファイル）削除
rmdir /s /q rchive_tmp

```

<details><summary>【参考】PowerShellを使用した場合</summary>

純粋なPowerShellコマンドではなく、aliasばかりですが…

```powershell
# ファイル確認
ls archive* -name

# 以下が存在する前提
# archive.tar

# 作業ディレクトリ作成
mkdir archive_tmp

cd archive_tmp

# tar.gz 展開
tar xzf ../archive.tar.gz

# tar 作成
tar cf ../archive.tar *

cd ..

# ファイル確認
ls archive* -name

# 以下が存在する
# archive.tar
# archive.tar.gz
# archive_tmp

# 作業ディレクトリ（と展開したファイル）削除
rm -r archive_tmp

```
</details>

# tar.gz を tar にするバッチ

## バッチファイル

コマンドプロンプトでの実施手順をベースに作成。

バッチだとコマンド確認しながら実行とはいかないので
入力チェックと、アーカイブファイルの展開・作成前の確認表示を追加。


```bat:targz2tar.bat
@echo off
rem ==================================================================
rem  archive.tar.gz を archive.tar にする
rem ------------------------------------------------------------------
rem 【概要】
rem   圧縮アーカイブファイル（.tar.gz）を展開し、
rem   無圧縮アーカイブファイル（.tar）を作成する。
rem  
rem 【引数】
rem    1.処理対象の.tar.gzファイル
rem ==================================================================

rem == check argument
if "%~1"=="" (
    echo;
    echo 処理対象のtar.gzファイルをドラッグandドロップして！
    pause
    exit /b
)

if not "%~x1"==".gz" (
    echo;
    echo これはtar.gzファイルではありません
    pause
    exit /b
)

set tarname=%~n1
set tarext=%tarname:~-4%

if not "%tarext%"==".tar" (
    echo;
    echo これはtar.gzファイルではありません
    pause
    exit /b
)

rem == set filepath
set fullpath_gz=%~f1
set fullpath_tar=%~dpn1

rem == set work directory
set workdir=%fullpath_tar:~,-4%_tmp

rem == 
echo;
echo : tar.gz から tar を作成します
echo;
echo ------------------------------------------------------------
echo * 処理条件
echo ------------------------------------------------------------
echo * tar.gz  : %fullpath_gz%
echo * tar     : %fullpath_tar%
echo *
echo * workdir : %workdir%
echo ------------------------------------------------------------
echo;
echo : 処理を開始します                        処理中止は窓close!
pause

rem == main
echo;
echo create work directory.
mkdir   %workdir%

pushd   %workdir%

echo Extract archive file ...
tar xzf %fullpath_gz%

echo Create archive file ...
tar cf  %fullpath_tar%  *

popd

echo delete work directory.
rmdir /s /q %workdir%

echo;
echo : 処理完了
pause

exit /b 0
```

## 使い方

処理対象のtar.gzをこのバッチにドロップする。

または、

処理対象のtar.gzをパラメータ指定してバッチを実行する。

```
> targz2tar.bat ./archive.tar.gz
```


## 実行例

```:実行結果
: tar.gz から tar を作成します

------------------------------------------------------------
* 処理条件
------------------------------------------------------------
* tar.gz  : C:\bat\archive.tar.gz
* tar     : C:\bat\archive.tar
*
* workdir : C:\bat\archive_tmp
------------------------------------------------------------

: 処理を開始します                        処理中止は窓close!
続行するには何かキーを押してください . . .

create work directory.
Extract archive file ...
Create archive file ...
delete work directory.

: 処理完了
続行するには何かキーを押してください . . .

```


## メモ：引数取得変数と文字列操作

言い換えると、バッチで使っている`~`を含む変数・処理についての覚書

以下のコマンド（ディレクトリ、引数）で実行した場合

```:実行コマンド
C:\bat> targz2tar.bat ./archive.tar.gz
```

バッチで使っている`%~`で始まる変数に何が設定されるのか

|  | 変数     | 取得する情報 | 取得値 |
|-:|:--------:|:------------|:-------|
| 1| `%~1`    | 引数１ | ./archive.tar.gz |
| 2| `%~x1`   | 引数１のファイル拡張子 | .gz  |
| 3| `%~n1`   | 引数１のファイル名（ファイル拡張子は含まない） | archive.tar |
| 4| `%~f1`   | 引数１の完全修飾パス（フルパス） | C:\bat\archive.tar.gz |
| 5| `%~dpn1` | 引数１のドライブ文字＋パス＋ファイル名 | C:\bat\archive.tar |


バッチで使っている`~`を含む処理＝文字列操作は、何をしているのか

```bat:
rem 引数１のファイル名
rem  = archive.tar
set tarname=%~n1

rem archive.tar の後ろから4文字
rem  = .tar
set tarext=%tarname:~-4%

rem 引数１のドライブ文字＋パス＋ファイル名
rem  = C:\bat\archive.tar
set fullpath_tar=%~dpn1

rem C:\bat\archive.tar の後ろから4文字を除外 + '_tmp'
rem  = C:\bat\archive_tmp
set workdir=%fullpath_tar:~,-4%_tmp
```




# 参考

* tar関連

  * [tarコマンド、gzipコマンドの使い方](https://qiita.com/sympe/items/13819ebe57a46090f064)

  * [Windowsネイティブな環境でのtar.gzファイルの解凍](https://rcmdnk.com/blog/2021/09/17/computer-windows/)


* バッチ関連
  * [Windows バッチファイルの引数とパス名要素分解、対話入力、文字列置換まとめ](
https://qiita.com/hkuno/items/e7fedc20a61979aa6078)

  * [コマンドプロンプトで部分文字列取得](https://qiita.com/omaenimutyuu/items/934b2d57e6c93bb93450)

  * [Windowsバッチまとめ](https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f)