酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Perlを使って無圧縮tarファイルを作る

仕事で無圧縮tarが必要になり、少し四苦八苦したのでメモついでに、GNU tarを使った無圧縮tarファイルの作り方を紹介したいと思います。

cygwinにデフォルトでtarが存在すると思いますのでそれを使います。コマンドプロンプトでtarが使えなかった方は、cygwinをインストールしてパスを通してください。

コマンドプロンプトより下記のコマンドを打ちます。

tar -cf dst.tar src01.txt src02.mov

これでdst.tarが生成されます。ちなみに今回使用したオプションは、-c:新規作成、-f:出力ファイル指定の2つです。

なお、指定した入力ファイル順に処理されますので、厳密に順番通りに圧縮しないといけない場合には、気をつけないといけないです。

perlスクリプトで無圧縮tarを使いたかったので、書いたサブルーチンはこんな風になりました。cygwinを理解していればもっとマシなコードになるんでしょうけど……

####################################################################
# 指定されたフォルダを無圧縮Tarでアーカイブする
####################################################################
sub compress_tar()
{
 my ($input_dir, $output_dir, $filename, @file) = @_;

 # 現在のカレントディレクトリを保持する
 use Cwd;
 my $wd = Cwd::getcwd();

 # Tarたんは日本語が苦手なので
 # 一瞬だけカレントディレクトリを移動させる
 chdir "$input_dir";

 # 無圧縮tarでファイルをまとめる
 # 日本語混じりの絶対パスでは使えないので
 # 圧縮対象のファイルがあるフォルダに一時ファイルを作る
 system("tar -cf $filename @file");

 # 一時ファイルを指定されたフォルダへコピーし、
 # 一時ファイルを削除する。
 system("copy $input_dir\\$filename $output_dir /y");
 unlink "$input_dir\\$filename";

 # カレントディレクトリを元に戻す
 chdir $wd;
}

追記

C#を使って無圧縮tarファイルを作る方法については、「C#で統合アーカイバのラッパーライブラリを使って無圧縮Tarファイルを簡単に作る - 酢ろぐ!」で書きました。