tarコマンドは、アーカイブファイルを作成するコマンドになります。複数のファイルを一つのファイルにまとめることができます。tarファイルをさらにgz形式に圧縮して、データの保存やデータの転送に利用することができます。また、tarの由来は"Tape ARchive"となりますが、今は磁気テープに保存することを目的として使うことはないかもしれません。
目次
アーカイブファイルとは
アーカイブファイルとは、複数のファイルやディレクトリを一つのファイルにまとめたファイルです。そして、アーカイブの中のファイルはメンバー(member)と呼ばれます。
アーカイブファイルはファイルの長期保存やバックアップ、他にもファイルの転送などに利用することができます。
アーカイブファイルを作成するのに、ファイルシステム内のファイルが削除されることはありません。また、アーカイブファイルからファイルを取り出すときもアーカイブファイルのメンバーが削除されることはありません。
また、アーカイブファイルは、日本語で書庫ファイルとも呼ばれています。
tarコマンドの操作オプション
tarコマンドはアーカイブファイルを操作するためのオプションがあります。操作オプションは以下の表になります。
操作オプション表
オプション | 意味 | ロングオプション |
-c | アーカイブファイルを作成 | --create |
-x | アーカイブファイルからメンバーを展開 | --extract --get |
-t | アーカイブファイルのメンバーをリスト | --list |
-r | アーカイブファイルにファイルを追加 | --append |
-u | アーカイブにファイルを追加。ただし、その追加するファイルがアーカイブファイル内のファイルより新しい場合、又はアーカイブファイル内にその追加するファイルが存在しない場合に追加。 | --update |
- | アーカイブファイルのメンバーを削除 | --delete |
-d | アーカイブファイルのメンバーとファイルシステム内のファイルを比較 | --compare --diff |
-A | アーカイブファイルに他のアーカイブファイルを結合 | --catenate --concatenate |
そして、操作オプションと同時によく使うオプションが2つあります。-fオプションと-vオプションになります。-fオプションはアーカイブファイルを指定するのに使用し、-vオプションはアーカイブファイル内のメンバーの情報を表示するのに使用します。
重要な2つのオプション
オプション | 意味 | ロングオプション |
-f archive-name | archive-nameのファイルを指定 | --file |
-v | 処理中のファイル名等を表示 | --verbose |
アーカイブファイルの作成
(-cオプション)
-cオプションは、-fオプションで指定したアーカイブファイルを作成し、コマンドライン引数で指定したファイルを作成したアーカイブファイルに入れることが出来ます。
コマンド例
1 |
tar -c -f archive.tar file.txt |
または
1 |
tar -cf archive.tar file.txt |
コマンド例実行前
1 2 |
$ls file.txt |
実行結果
1 2 3 4 5 |
$ls archive.tar file.txt $ $tar -tvf archive.tar -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 01:21 file.txt |
また、-vオプションを用いるとtarコマンドを実行した時にアーカイブファイルに入れたファイル名を表示することが出来ます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ls file.txt $ $tar -cvf archive.tar file.txt file.txt $ $ls archive.tar file.txt |
また、-vオプションを2回使用するとファイル名ではなく、ファイルの情報を表示することが出来ます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ls file.txt $ $tar -cvvf archive.tar file.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-14 17:19 file.txt $ $ls archive.tar file.txt |
コマンド例と実行結果
1 2 3 |
$tar -cf archive.tar tar: Cowardly refusing to create an empty archive Try 'tar --help' or 'tar --usage' for more information. |
もし、空のアーカイブファイルを作成したい場合は、/dev/nullを-Tオプションで指定することで空のアーカイブファイルを作成できます。
コマンド例
1 |
tar -cf archive.tar -T /dev/null |
アーカイブファイルのメンバーを表示
(-tオプション)
-tオプションはアーカイブファイルのメンバーを表示することができます。
コマンド例と実行結果
1 2 3 4 5 6 7 |
$tar -tf archive.tar dir1/ dir1/dir1-file2.txt dir1/dir1-file1.txt file1.txt file2.txt file3.txt |
また、-vオプションを追加するとアーカイブファイルのメンバーの詳細な情報を表示できます。下の実行結果で、左から3列目の0が並んでいる箇所はファイルサイズを表しています。全て空のファイルで実行しているため、0と表示されています。
コマンド例と実行結果
1 2 3 4 5 6 7 |
$tar -tvf archive.tar drwxrwxr-x ubuntu/ubuntu 0 2018-01-21 00:51 dir1/ -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 dir1/dir1-file2.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 dir1/dir1-file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file2.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file3.txt |
個別にアーカイブファイルのメンバーの情報を表示したい場合は、メンバーのファイルパスをコマンドライン引数で指定します。
コマンド例と実行結果
1 2 3 |
$tar -tvf archive.tar file2.txt dir1/dir1-file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 dir1/dir1-file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file2.txt |
アーカイブファイルのメンバーを展開
(-xオプション)
-xオプションは、アーカイブファイルのメンバーをアーカイブファイルから展開できます。アーカイブファイルの内容は基本的に相対パスで記述されています。アーカイブファイルのメンバーを展開する場合、カレントディレクトリからの相対パスでファイルが展開されます。
コマンド例
1 |
tar -xf archive.tar |
アーカイブファイルの内容
1 2 3 4 5 6 7 |
$tar -tf archive.tar dir1/ dir1/dir1-file2.txt dir1/dir1-file1.txt file1.txt file2.txt file3.txt |
カレントディレクトリの内容
1 2 3 4 5 |
$tree . └── archive.tar 0 directories, 1 file |
実行結果
1 2 3 4 5 6 7 8 9 |
$tree . ├── archive.tar ├── dir1 │ ├── dir1-file1.txt │ └── dir1-file2.txt ├── file1.txt ├── file2.txt └── file3.txt |
また、コマンドライン引数にメンバーを記述した場合は、そのメンバーがファイルとして展開されます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$tree . └── archive.tar 0 directories, 1 file $ $tar -xf archive.tar dir1/dir1-file1.txt $ $tree . ├── archive.tar └── dir1 └── dir1-file1.txt 1 directory, 2 files |
アーカイブファイルにファイルを追加
(-rオプション)
-rオプションは、アーカイブファイルにファイルを追加することができます。また、指定したファイルは、コマンドライン引数で指定したファイルパスで入れられます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$tar -tf archive.tar file1.txt $ $tar -rf archive.tar file2.txt $ $tar -tf archive.tar file1.txt file2.txt |
アーカイブファイルのメンバーを更新
(-uオプション)
-uオプションは、アーカイブファイルのメンバーにコマンドライン引数で指定したファイルが存在しない、又はコマンドライン引数で指定したファイルが新しい場合、そのファイルをアーカイブファイルに追加することができます。
コマンド例と実行結果
1 2 3 4 5 |
$tar -tvf archive.tar -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file2.txt -rw-rw-r-- ubuntu/ubuntu 10 2018-01-21 01:29 file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file3.txt |
--ocurrenceオプションは数字を指定することができます。重複した名前を指定したとき、アーカイブファイルのリスト上で一番上のものが1、その下のものが2というように指定できます。また、--occurenceオプションで特に数字を指定しない場合、デフォルトは1になります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 |
$tar -tvf archive.tar file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file1.txt -rw-rw-r-- ubuntu/ubuntu 10 2018-01-21 01:29 file1.txt $ $tar -tvf archive.tar --occurrence=1 file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 00:51 file1.txt $ $tar -tvf archive.tar --occurrence=2 file1.txt -rw-rw-r-- ubuntu/ubuntu 10 2018-01-21 01:29 file1.txt |
アーカイブファイルのメンバーを削除
(--deleteオプション)
--deleteオプションは指定したアーカイブファイルのメンバーを削除することができます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 |
$tar -tf archive.tar file1.txt file2.txt file3.txt $ $tar --delete -f archive.tar file1.txt $ $tar -tf archive.tar file2.txt file3.txt |
アーカイブファイルのメンバーとファイルシステムのファイルのファイル情報を比較
(-dオプション)
-dオプションは、アーカイブファイルのメンバーとファイルシステムのファイルでの、ファイルサイズや更新日時、ファイル権限などの情報を比較します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 |
$ls -l file1.txt -rw-rw-r-- 1 ubuntu ubuntu 18 1月 21 02:03 file1.txt $ $tar -tvf archive.tar file1.txt -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 02:02 file1.txt $ $tar -df archive.tar file1.txt file1.txt: Mod time differs file1.txt: Size differs |
アーカイブファイルに他のアーカイブファイルを結合
(-Aオプション)
-Aオプションは、アーカイブファイルに他のアーカイブファイルの内容を結合することができます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$tar -tf archive1.tar file1.txt file2.txt file3.txt $ $tar -tf archive2.tar dir1/ dir1/dir1-file2.txt dir1/dir1-file1.txt $ $tar -Af archive1.tar archive2.tar $ $tar -tf archive1.tar file1.txt file2.txt file3.txt dir1/ dir1/dir1-file2.txt dir1/dir1-file1.txt |
tarコマンドのオプション
tarコマンドには、操作オプションの他に、その処理に影響を及ぼすオプションがとても多くあります。-fオプションや-vオプションはその例になります。例えば、GNU tarのすべてのオプションは3.4.2 tar Optionsにまとめられています。
圧縮に関するオプション
tarコマンドは、アーカイブファイルを作成するのと同時に圧縮を行うことができます。例えば、GNU tarでサポートされている圧縮オプションには以下のものがあります。
圧縮のオプション
オプション | ファイル拡張子 | 圧縮プログラム |
-z --gzip |
.gz .tgz .taz |
gzip |
-J --xz |
.xz | xz |
-j --bzip2 |
.bz2 .tz2 .tbz2 .tbz |
bzip2 |
--lzip | .lz | lzip |
--lzma | .lzma .tlz |
lzma |
--lzop | .lzo | lzop |
-Z --compress |
.Z .taZ |
compress |
例えば、gz形式に圧縮するコマンド例は以下のようになります。また、gzipコマンドの-tオプションはgzipで圧縮されたファイルかどうかを確認するオプションで、-vオプションはその情報を表示するオプションになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 |
$ls file1.txt $ $tar -czf archive.tar.gz file1.txt $ $ls archive.tar.gz file1.txt $ $gzip -tv archive.tar.gz archive.tar.gz: OK |
また、tarコマンドの-aオプションを用いると作成するアーカイブファイルのファイル拡張子に合う圧縮を自動で行います。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 |
$ls file1.txt $ $tar -caf archive.tar.gz file1.txt $ $ls archive.tar.gz file1.txt $gzip -tv archive.tar.gz archive.tar.gz: OK |
また、デフォルトの圧縮方法以外を用いる場合は-Iオプションまたは通常の圧縮方法を用いることができます。また、パイプを用いた例で指定したファイル'-'は標準出力を指定しています。
コマンド例
1 |
tar -cf archive.tar.gz -I 'gzip -9' file1.txt |
または
1 |
tar -cf - file1.txt | gzip -9 > archive.tar.gz |
上書きに関するオプション
tarコマンドでファイルを展開する場合は、デフォルトの動作としてファイルは上書きされます。上書きを抑制する場合は、以下のオプションがあります。
上書き抑制のオプション
オプション | 意味 |
-k -keep-old-file |
ファイルを上書きしない。 上書きしないファイルがある場合、 標準エラー出力にメッセージを表示 |
--skip-old-files | ファイルを上書きしない。 メッセージも表示しない |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ls -l 合計 12 -rw-rw-r-- 1 ubuntu ubuntu 10240 1月 21 18:01 archive.tar -rw-rw-r-- 1 ubuntu ubuntu 0 1月 21 18:03 file1.txt $ $tar -tvf archive.tar -rw-rw-r-- ubuntu/ubuntu 0 2018-01-21 15:29 file1.txt $ $tar -xkf archive.tar tar: file1.txt: Cannot open: File exists tar: Exiting with failure status due to previous errors $ $ls -l 合計 12 -rw-rw-r-- 1 ubuntu ubuntu 10240 1月 21 18:01 archive.tar -rw-rw-r-- 1 ubuntu ubuntu 0 1月 21 18:03 file1.txt $ $tar -xf archive.tar --skip-old-files $ls -l 合計 12 -rw-rw-r-- 1 ubuntu ubuntu 10240 1月 21 18:01 archive.tar -rw-rw-r-- 1 ubuntu ubuntu 0 1月 21 18:03 file1.txt $ $tar -xf archive.tar $ls -l 合計 12 -rw-rw-r-- 1 ubuntu ubuntu 10240 1月 21 18:01 archive.tar -rw-rw-r-- 1 ubuntu ubuntu 0 1月 21 15:29 file1.txt |
tarコマンドのファイル展開時のデフォルトの動作は上書きですが、上書きを明示したい場合のオプションとして、--overwriteもあります。
1 |
tar -xf archive.tar --overwrite |
展開時のファイルを標準出力または外部プログラム操作
アーカイブファイルからファイルを展開するときに、そのファイルを標準出力または外部プログラムによる操作を行うことができます。
標準出力
(-Oオプション)
アーカイブファイルからファイルを展開するとき、-Oオプションを用いるとファイルを作成するのではなく、そのファイルを標準出力することができます。
コマンド例と実行結果
1 2 3 4 5 6 7 |
$cat file1.txt file1.txt content $ $tar -cf archive.tar file1.txt $ $tar -O -xf archive.tar file1.txt file1.txt content |
また、-Oオプションを用いれば、パイプを通して、ファイルを処理することができます。
コマンド例と実行結果
1 2 |
$tar -O -xf archive.tar file1.txt | tr a-z A-Z FILE1.TXT CONTENT |
外部プログラム操作
(--to-commandオプション)
複数のファイルをアーカイブファイルから取り出して、プログラムで処理をする場合、--to-commandオプションが利用できます。
アーカイブファイルから取り出したファイルはファイルを作成するのではなく、パイプを通して、--to-commandオプションで指定したコマンドによって処理されます。
--to-commandオプションを利用する場合、環境変数から情報を得ることができます。環境変数はGNU tarのマニュアルのWriting to an External Programにまとめられています。
ここでは、tarコマンドで拡張子が.txtファイルの内容を表示していきます。シェルスクリプト、test.shを作成して、test.shを--to-commandを用いて実行してみます。
test.sh
1 2 3 4 5 6 7 8 9 10 |
#/bin/sh case $1 in *.txt) printf "==begin $1 content==\n" cat < /dev/stdin printf "==end content==\n\n" ;; *) esac |
このtest.shは引数にファイル名を必要とし、そのファイル名の拡張子が.txtの場合は、そのファイルの内容を表示します。
また、以下のファイルからアーカイブファイルを作成します。
アーカイブファイルに保存するファイルの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$cat datafile xxxxx yyyyy zzzzz $ $cat file1.txt aaaaa bbbbb ccccc $ $cat file2.txt ddddd eeeee fffff $ $cat file3.txt ggggg hhhhh iiiii |
上のファイルからアーカイブファイルを作成し、--to-commandオプションでtest.shを利用しtarコマンドで拡張子が.txtのファイルの内容を表示していきます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ls datafile file1.txt file2.txt file3.txt test.sh $ $tar -cvf archive.tar datafile file* datafile file1.txt file2.txt file3.txt $ $tar -xf archive.tar --to-command='./test.sh $TAR_FILENAME' ==begin file1.txt content== aaaaa bbbbb ccccc ==end content== ==begin file2.txt content== ddddd eeeee fffff ==end content== ==begin file3.txt content== ggggg hhhhh iiiii ==end content== |
以上のように、--to-commandオプションを用いて、tarコマンドでアーカイブ内のファイルを外部プログラムで処理することができます。