tar は、Unix および Linux ベースのシステムで使用できる一般的なファイル アーカイブ形式の 1 つです。
名前自体は、テープ デバイスにシーケンシャル データを書き込むために開発された Tape AR chive に由来しています。 tarball と呼ばれることもあります。
デフォルトでは、tar はファイルを圧縮せずに一部を使用してアーカイブするだけです。さまざまな圧縮技術を使用して、圧縮された出力を取得できます。 tar ユーティリティは、通常、ほとんどの Linux ディストリビューションにデフォルトで含まれており、この形式自体は、さまざまなツールやユーティリティを介して Windows や macOS などの他のオペレーティング システムでサポートされています。
この記事では、tar コマンドとそのサポートされるフラグの一般的な例と使用法について説明します。
それでは始めましょう…
tar アーカイブを作成する
単純な非圧縮アーカイブを作成するための
tar
コマンドの構文は次のとおりです。
$ tar cvf <tar-file-name> <files-to-archive>
ここで、フラグ
c
作成を表し、
v
は詳細出力を表し、
f
は tar アーカイブ ファイル名の指定を表します。慣例により、tar ファイル名には
.tar
拡張子を付けて指定します。アーカイブするファイルは、ワイルドカードを使用するか、単一または複数のファイル名/パスとして指定できます。
例として、ディレクトリに 3 つのファイルがあります。
$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$
そして、3 つのファイルすべてを含む
tar
アーカイブを作成したいと思います。これは次のように実行できます。
$ tar cvf archive.tar *
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
$
次のように、特定のファイルのみをアーカイブするように指定することもできます。
$ tar cvf archive1.tar file1.txt file2.txt
file1.txt
file2.txt
$ ls -l archive1.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar
$
圧縮アーカイブ (GZ) の作成
tar を使用すると、ファイルをアーカイブできるだけでなく、圧縮してスペースを節約することもできます。一般的な圧縮形式の 1 つは、gunzip です。通常、
.tar
の後に拡張子
.gz
を付けるか、
tgz
として表されます。
z
フラグを使用して、gunzip を使用してファイルを圧縮する必要があることを指定できます。以下に例を示します。
$ tar cvzf archive.tar.gz file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz
$
両方のアーカイブ ファイルに同じ 3 つのファイルが含まれているにもかかわらず、両方のアーカイブ ファイルのサイズが大幅に異なることがわかります。これは、
z
フラグを使用した圧縮の使用によるものです。
圧縮アーカイブの作成 (BZ2)
tar は、他のいくつかの圧縮形式をサポートしています。そのうちの 1 つは
bz2
または
bzip2
で、拡張子
tar.bz2
または場合によっては
tbz2
で表されます。アーカイブのサイズは小さくなりますが、CPU の消費量が増えるため、圧縮/解凍のプロセスが
gz
アーカイブよりも遅くなる可能性があります。
例:
$ tar cvjf archive.tar.bz2 file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 12 20:25 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz
$ file archive.tar*
archive.tar: POSIX tar archive (GNU)
archive.tar.bz2: bzip2 compressed data, block size = 900k
archive.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 10240
$
すべてのファイルを解凍
tar アーカイブ (圧縮または非圧縮に関係なく) は、
x
オプションを使用するだけで抽出できます。以下の例でその使用法を明確にします。
$ tar xvf archive.tar
file1.txt
file2.txt
file3.txt
$ ls -l
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$
これは、
gz
圧縮アーカイブでは次のように機能します。
$ tar xvf archive.tar.gz
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$
または、
bz2
圧縮アーカイブの場合でも次のようになります。
$ tar xvf archive.tar.bz2
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$
tar の内容をリストする
tar アーカイブの内容を一覧表示するには、以下に示すように
t
フラグを使用できます。
$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$
特定のファイルを解凍する
次のようにファイル名を指定すると、
tar
、
tar.gz
、
tar.bz2
アーカイブから 1 つのファイルだけを抽出できます。
$ tar xvf archive.tar.bz2 file1.txt
file1.txt
$ ls -l
total 8
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
$
同様に、複数のファイル名をスペースで区切って指定し、一度にまとめて抽出することができます。
$ tar xvf archive.tar.bz2 file1.txt file3.txt
file1.txt
file3.txt
$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$
ワイルドカードを使用して解凍する
ワイルドカード
PATTERN
を使用して 1 つ以上のファイルを抽出するには、
--wildcards
フラグを使用します。
$ tar xvf archive.tar.bz2 --wildcards "file*"
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$
ファイルをアーカイブに追加
新しいファイルは、新しいファイル名またはワイルドカード パターンを指定して
r
または
--append
フラグを使用することで、既存の非圧縮 tarball に追加/追加できます (これは非圧縮
.tar
ファイルでのみ機能し、
tar.gz
または
tar.bz2
圧縮形式では機能しないことに注意してください)。
$ tar rvf archive.tar file-new*
file-new.txt
file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt
$
archive.tar
の内容をリストすると、新しく追加された 2 つのファイルが再度表示されることがわかります。
アーカイブからファイルを削除
以下に示すように
--delete
フラグを使用すると、tar アーカイブから特定のファイルを削除できます (ファイルの削除前と削除後の tar リストを比較してください)。
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt
$ tar --delete -f archive.tar file-new.txt file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
$
繰り返しになりますが、これは非圧縮 tarball に対してのみ機能し、圧縮されたアーカイブ形式に対しては失敗します。
検証して作成
非圧縮 tar ファイルの作成中に、次のように
W
フラグを使用してアーカイブの内容を確認できます。
$ tar cvfW archive.tar file*.txt
file1.txt
file2.txt
file3.txt
Verify file1.txt
Verify file2.txt
Verify file3.txt
$
これを圧縮フラグと一緒に使用することはできませんが、後で
gzip
または他のツールを使用して作成された
tar
ファイルを圧縮することはできます。
tarをフォルダーに抽出します
tarball の内容を現在のディレクトリではなく特定のフォルダーに抽出する場合は、以下に示すように、ディレクトリ パスを指定して
-C
フラグを使用します。
$ tar xvf archive.tar -C new-directory/
file1.txt
file2.txt
file3.txt
file2.txt
file4.txt
$ ls -l new-directory/
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt
$
差分フラグを使用する
--diff
または
d
フラグを使用すると、tar アーカイブ内のファイルとファイルシステム内のファイル間の変更を見つけることができます。以下は、tar 内と tar 外部のファイルが同じである場合に
diff
を 1 回実行する例です。ファイルを更新した後、出力の違いを示すためにもう一度実行されました。
$ tar dvf archive.tar file4.txt
file4.txt
$
$ echo newline > file4.txt
$
$ tar dvf archive.tar file4.txt
file4.txt
file4.txt: Mod time differs
file4.txt: Size differs
$
ファイルの除外
tar アーカイブを作成するときに、特定のファイルを除外することが要件になる場合があります。これは
--exclude
フラグを使用して実現できます。
$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/
dir/
dir/file1.txt
dir/file3.txt
$ ls -l dir
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt
$ tar tvf archive.tar.gz
drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/
-rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt
-rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt
$
上記の出力からわかるように、
--exclude
フラグを複数回指定して、複数のファイル名またはパターンを
AND
条件で指定できます。上記の例の
dir
内の 6 つのファイルのうち、
archive.at.gz
に含める条件を満たしたファイルは 2 つだけであることに注意してください。
tar コンテンツのサイズを表示する
以下のコマンドを使用して、圧縮された tar アーカイブの内容のサイズを取得できます。
$ tar tvf archive.tar.gz
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xzf archive.tar.gz --to-stdout|wc -c
56
$
bz2
アーカイブについても同様です。
$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xjf archive.tar.bz2 --to-stdout|wc -c
56
$
権限を保持する
デフォルトでは、
tar
コマンドはアーカイブするファイルとディレクトリのアクセス許可を保持しますが、以下に示すように、
-p
フラグまたは
--preserve-permissions
を使用して同じアクセス許可を明示的に指定できます。
$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$
概要 👨💻
tar は、長い間 Unix/Linux システムで便利なユーティリティであり、主にアーカイブとバックアップのタスクに使用されていました。このユーティリティは、時間の経過とともに多くのオプションを備えて進化してきました。提供する機能を理解していれば、単純なタスクから複雑なタスクまで使用できます。この記事では、
tar
コマンドで実行できる基本操作のいくつかについて説明し、tar コマンドが日常のシステム管理タスクにどのように役立つかを紹介しました。
詳細については、マニュアル ページ
man tar
を参照するか、
tar --help
または
tar --usage
コマンドを使用してください。