ホーム テクノロジー LINUX システム管理者と開発者向けの 15 tar コマンドの例

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
$

特定のファイルを解凍する

次のようにファイル名を指定すると、 tartar.gztar.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コマンドを使用してください。

「システム管理者と開発者向けの 15 tar コマンドの例」についてわかりやすく解説!絶対に観るべきベスト2動画

Google for Education 管理者チュートリアル – ユーザー ライセンス管理 参考: GAM のセットアップ方法[Japan]
会員管理システムの機能と活用方法

Share via
Copy link