Linuxコマンド tar(tar形式のアーカイブ)

Linuxのtarコマンドの基本的な使用方法、オプション・ファンクション解説。サンプルを交えたコマンドの実用例等、記載しています。

実用例として、アーカイブ作成、内容表示、ファイル・ディレクトリのアーカイブ化、展開方法、既存アーカイブへの追加、Zip、Bzip2使用した圧縮及び展開、アーカイブ同士の統合方法、アーカイブ内の一部削除など記載。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:tar

概要・使用方法

tar(tape archives)は、UNIX系OSの標準フォーマットである。複数のファイルを1つにまとめたり、ファイルのユーザ情報とグループ情報、パーミッション、最終更新日時、ディレクトリ構造など同時にアーカイブすることができる。元々は、複数のファイルをまとめるための機能であり、圧縮機能はなかった。大半はアーカイブと同時にcompressやgzip、bzip2などの圧縮方法を用いて圧縮。これによりファイルはそれぞれ,.tarZ、.tar.gz、.tar.bz2となる。

デフォルトでは圧縮しないので、-z、-j、-Jオプションを使うことで圧縮ファイルにも対応します。

tarで作成されるアーカイブは、一般に「tar玉」「tarball」と呼ばれている。

使用方法は、tarコマンドの後にファンクションを指定、次にオプションを指定します。アーカイブファイルは-fオプションで指定します。指定しない場合は、標準入力/標準出力が利用されます。

tarコマンドは、そもそもテープストリーマにファイルをバックアップする目的で作成されたコマンドであるため、ファイルとして作成するにはオプションを指定する必要があります。

使用方法は、tarコマンドの後にファンクションを指定、次にオプションを指定します。アーカイブファイルは-fオプションで指定します。指定しない場合は、標準入力/標準出力が利用されます。

書式

$tar [ファンクション][オプション] アーカイブ [ファイル名またはディレクトリ名]

多くの場合は、-vオプションを併用し実行結果を表示するようにします。ファイルの属性まで含めて表示されます。オプションのハイフン(-)は、省略することができます。

サンプル:新規にアーカイブファイルを作成する

$tar cf file.tar file1 file2
$tar cvf file.tar file1 file2

実行結果を表示するオプション付き

実行結果

[centos@work sample]$tar cf file.tar file1 file2
[centos@work sample]$ls
file1  file2  file.tar
[centos@work sample]$ 

複数ディレクトリをアーカイブする方法

ファイルが多数ある場合は、扱いづらいのでディレクトリにまとめて、アーカイブすると良いでしょう。

$tar cvf dir.tar dir1 dir2

実行結果

[centos@work sample]$tar cvf dir.tar dir1 dir2
dir1/
dir1/sample2.txt
dir1/sample1.txt
dir2/
dir2/sample4.txt
dir2/sample3.txt

ファンクション

-A,
–catenate,–concatenate
アーカイブにファイルを追加する
-c,
–create
アーカイブを作成する
-d
–diff, –compare
アーカイブと実際のファイルの差分を出力する
–deleteアーカイブから指定したファイルを削除する
-r
–append
指定したファイルをアーカイブの最後に追加する
-t
–list
アーカイブの内容を一覧で表示する
-u
–update
アーカイブの中にあるファイルと同名のファイルより新しいものを追加する。
-x
-extract,–get
アーカイブからファイルを取得する。存在するアーカイブがあれば上書きせずにバックアップを作成する。
–backup=numberedと指定すればバックアップファイルの末尾に番号をつける
ファンクション一覧

オプション

-C ディレクトリ名
–directory ディレクトリ名
ディレクトリに移動し、アーカイブもしくは展開する
–exclude=パターンパターにマッチしたファイルをアーカイブもしくは展開しない
-f アーカイブ
–file [ホスト名] アーカイブ
指定したアーカイブ、もしくはデバイスを利用する
–force-local指定したアーカイブ、もしくはデバイスを利用する
–group グループ名指定したアーカイブに「:」があった場合、ローカルファイルとして認識する
–group グループ名指定したグループにしてファイルをアーカイブに追加する
-h
–dereference
シンボリックリンク先をアーカイブする
-Z
–compress,–uncompress
compress形式を利用して圧縮/展開する
-z
–gzip、–ungzip
gzip形式を利用して圧縮/展開する
-j
–bzip2
bzip2形式を利用して圧縮/展開する
-Jxz形式を利用して圧縮/展開する
-k
–keep-old-files
-extract、–get
展開時に既に同じファイル名があった場合は、上書きしない
-m
–touch
展開したファイルの変更時間を反映しない
–modeモード指定したパーミッションでアーカイブにファイルを追加する。
「644」の値を利用する
-N 日付
–after-date 日付、 –newer日付
指定した日付より新しいファイルを格納する
-O
–to-stdout
展開したファイルを標準出力に出力する
–remove-filesアーカイブ追加後に指定したファイルを削除する
–same-ownerアーカイブ内のファイル属性を引き継いで展開する
-T ファイル名
–files-from ファイル名
展開もしくは圧縮するファイルを指定したファイルからファイル名を読み込む
-v
–verbose
処理したファイルの一覧を表示する
-X ファイル名
–exclude-from ファイル名
指定したファイル名パターンを除外してから処理する
–suffix=文字出力ファイル名が既に存在する場合はバックアップを作成する。
ファイル名に指定した文字を末尾に付加する。
–nullファイル区切りをNULL文字として読む
オプション一覧表

アーカイブの内容を表示する(非圧縮)

アーカイブの内容を表示することができます。比較的よく使うコマンドになります。非圧縮アーカイブが対象となります。

サンプル

$tar tvf cmd.tar

実行結果

[centos@work sample]$ ls
cmd.tar  file1  file2  file3  file.tar
[centos@work sample]$tar tvf cmd.tar 
-rwxr-xr-x root/root    100184 2018-05-25 00:32 bin/ps
[centos@work sample]$ 

既存のアーカイブファイルにファイルやディレクトリを追加する。

ログファイルなど月に1度や週に1度、毎日といった頻度でアーカイブの更新が必要があります。そのような場合、アーカイブを展開してファイルやディレクトリを追加してアーカイブを作成するのは非効率的なので、既存のアーカイブに追加する方法を使用する。

-uオプションを付けてtarコマンドを実行すると良いでしょう。

サンプル

$tar uvf logfile.tar apachelog_20220101.log

実行結果

[centos@work sample]$ tar tvf log.tar 
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202201.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202202.log

[centos@work sample]$tar uvf log.tar apache_202203.log 
apache_202203.log

[centos@work sample]$tar tvf log.tar 
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202201.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202202.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:29 apache_202203.log
[centos@work sample]$  

既存のアーカイブファイルの末尾にファイルやディレクトリを追加する。

-uオプションでアーカイブファイルにファイルやディレクトリの追加する場合は、同一名称のファイルやディレクトリが存在する場合、タイムスタンプにより、新しいもの一方だけがアーカイブ内に格納されます。

しかし、既存のファイルを保持してアーカイブの末尾にファイルを追加したいこともあります。その場合は、-rオプションを指定してコマンドを実行します。

サンプル

$ tar rvf logfile.tar apachelog_20220101.log

実行結果

[centos@work sample]$ tar tvf log.tar 
-rw-rw-r-- centos/centos        5 2022-02-15 15:25 apache_202201.log
-rw-rw-r-- centos/centos        5 2022-02-15 15:25 apache_202202.log
-rw-rw-r-- centos/centos        5 2022-02-15 15:29 apache_202203.log

[centos@work sample]$ tar rvf log.tar apache_202203.log 
apache_202203.log

[centos@work sample]$ tar tvf log.tar 
-rw-rw-r-- centos/centos        5 2022-02-15 15:25 apache_202201.log
-rw-rw-r-- centos/centos        5 2022-02-15 15:25 apache_202202.log
-rw-rw-r-- centos/centos        5 2022-02-15 15:29 apache_202203.log
-rw-rw-r-- centos/centos        5 2022-02-15 15:29 apache_202203.log
[centos@work sample]$ 

アーキアイブファイルの内容一覧を表示する。

サンプル

$ tar tf file.tar file3

実行結果

[centos@work sample]$ls
file1  file2  file3  file.tar
[centos@work sample]$tar tf file.tar
file1
file2
file3
[centos@work sample]$ 

アーカイブファイルを展開します。

アーカイブファイルを展開するには、-xオプションを付けてtarコマンドを実行します。保存対象がテープではなくファイルである場合はには-fオプションをを付けてください。

展開後もアーカイブファイルは削除されません。展開したディレクトリにアーカイブ内に含まれる同名のファイルやディレクトリがあった場合は、タイムスタンプにより比較され、新しいほうだけが残ります。

ただし、-kオプションを付けて実行することにより、取り出すディレクトリに同名のファイルが存在する場合、エラーメッセージを表示して処理が中断されます。

サンプル

$ tar xf file.tar
$ tar xvf file.tar 

実行結果

[centos@work sample]$ls
file.tar
[centos@work sample]$tar xf file.tar
[centos@work sample]$ls
file1  file2  file3  file.tar
[centos@work sample]$ 

アーキアイブから一部のファイルやディレクトリを取り出す。

基本的には、アーカイブの展開と同様のオプションになりますが、引数にファイル名を指定することで、一部のファイルやディレクトリを展開することができます。

ディレクトリを指定した場合は、再帰的にサブディレクトリも展開します。展開ディレクトリに同名のファイル名、ディレクトリ名がある場合は、タイムスタンプにより比較され、新しいほうでで上書きされます。ただし、-kオプションを付けて実行した場合は、エラーメッセージが表示され中断させることもできます。

サンプル

$ tar xf file.tar ファイル名、ディレクトリ名

実行結果

[centos@work sample]$tar xvf log.tar apache_202201.log 
apache_202201.log
[centos@work sample]$ls
apache_202201.log  apache_202203.log  log.tar

アーカイブ内のファイルやディレクトリを削除する

アーカイブファイルから格納されているファイルやディレクトリを削除することができます。削除するためには、-deleteオプションを使用します。これは他のtarコマンドのオプションとは異なり、ハイフン2つから構成するロングオプション(–)になり、省略することができません。

また、他のオプションより前に指定する必要があります。

サンプル

$tar --delete -vf アーカイブファイル アーカイブ内のファイル名及びディレクトリ名

実行結果

[centos@work sample]$tar tvf log.tar 
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202201.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202202.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:29 apache_202203.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:29 apache_202203.log

[centos@work sample]$tar --delete -vf log.tar apache_202201.log 

[centos@work sample]$tar tvf log.tar 
-rw-rw-r-- centos/centos         5 2022-02-15 15:25 apache_202202.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:29 apache_202203.log
-rw-rw-r-- centos/centos         5 2022-02-15 15:29 apache_202203.log
[centos@work sample]$ 

ファイルを指定してアーカイブを作成する(標準入力/出力)

サンプル

$ tar cv /bin/ls /bin/ps > cmd.tar
$ tar tv < cmd.tar

実行結果

[centos@work sample]$ls
file.tar
[centos@work sample]$tar xf file.tar
[centos@work sample]$ls
file1  file2  file3  file.tar
[centos@work sample]$ 

Zip形式で圧縮しアーカイブを作成する

tarコマンドのフィルタとして、よく用いられるZipコマンドを使用して圧縮する方法。拡張子は慣習として「.tgz」及び「tar.gz」が使用します。

サンプル

$tar czvf アーカイブファイル名 ファイル名、ディレクトリ名

実行結果

[centos@work sample]$tar czvf log.tgz apache_202201.log 
apache_202201.log
[centos@work sample]$ls -la
total 28
drwxrwxr-x 2 centos/centos  4096 Feb 15 16:56 .
drwx------ 9 centos/centos  4096 Feb 15 15:29 ..
-rw-rw-r-- 1 centos/centos     5 Feb 15 15:25 apache_202201.log
-rw-rw-r-- 1 centos/centos   136 Feb 15 16:56 log.tgz
-rw-rw-r-- 1 centos/centos 10240 Feb 15 16:49 log.tar
[centos@work sample]$ 

Zip形式で圧縮したアーカイブを展開する

展開を意味する-xオプション、及びzipをフィルタにすることを意味する-zオプションを使用します。

サンプル

$tar xzvf アーカイブファイル名 ファイル名・・・、ディレクトリ名・・・

実行結果

[centos@work sample]$tar xzvf log.tgz 
apache_202201.log
[centos@work sample]$ls
apache_202201.log  log.tar  log.tgz
[centos@work sample]$ 

Bzip2形式で圧縮しアーカイブを作成する

Bzip2形式で圧縮しアーカイブを作成するには、-jオプションを使用します。アーカイブの拡張子は慣習として、「.tbz2」及び「.tar.bz2」という拡張子にします。

サンプル

$tar cvjf アーカイブファイル名.tbz2 ファイル名・・・、ディレクトリ名・・・

Bzip2形式で圧縮されたアーカイブを展開する

Bzip2形式で圧縮しアーカイブを作成するには、-jオプションを使用します。展開を意味する-xオプションも併用します。

サンプル

$tar xvjf アーカイブファイル名.tbz2

tarアーカイブにtarアーカイブを統合する

-Aオプションを使用することで、2つのアーカイブを1つのアーカイブに統合することができます。左辺に指定したアーカイブファイルに統合します。

サンプル

$tar Avf アーカイブ名.tar アーカイブ名.tar 

実行結果

[centos@work sample]$ tar tf log1.tar
apache_202201.log
[centos@work sample]$ tar tf log2.tar
apache_202202.log
apache_202203.log
apache_202203.log
[centos@work sample]$ tar Avf log1.tar log2.tar 
[centos@work sample]$ tar tf log1.tar
apache_202201.log
apache_202202.log
apache_202203.log
apache_202203.log
[centos@work sample]$