PR

【Ubuntu】複数のファイルやディレクトリを一つのファイルにアーカイブする方法(tarコマンド)

Ubuntuで複数のファイルやディレクトリを、「tar」コマンドを使って一つのファイルにアーカイブ(まとめる)する方法です。

tarコマンドの使い方

「tar」コマンドは、複数のファイルやディレクトリをアーカイブ(まとめること)したり、アーカイブしたファイルを展開(元に戻すこと)することができます。

アーカイブの作成

複数のファイルやディレクトリをアーカイブする場合は、下記のように「tar」を実行します。

tar cfv アーカイブ名.tar ファイル1 ファイル2 ファイル3 ディレクトリ_1

指定しているオプションはそれぞれ下記の役割を持っています。

  • c 新しいアーカイブを作成
  • f アーカイブのファイル名指定
  • v 詳細なログを表示(任意)

実行状況の詳細なログ出力が必要ない場合は「v」オプションを使用しなくても良いです。

アーカイブ実行例

「text_01.txt」「text_02.txt」「text_03.txt」ファイルと「dir_01」ディレクトリを「text.tar」という名前でアーカイブします。

$ tar cfv text.tar text_01.txt text_02.txt text_03.txt dir_01/
text_01.txt
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

「text.tar」というアーカイブされたファイルが作成されました。

$ ls -l
total 8208
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 10:50 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_01.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_02.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_03.txt
-rw-rw-r-- 1 tamohiko tamohiko 5253120 Feb 17 10:52 text.tar

アーカイブファイルの作成場所を指定する方法

アーカイブファイル名を指定する際に、パスも含めてあげることでアーカイブファイルを作成するディレクトリを指定することが出来ます。

下記の例では、「backup」というディレクトリ内に、アーカイブファイル「text.tar」を作成しています。

$ tar cfv ./backup/text.tar text_01.txt text_02.txt text_03.txt dir_01/
text_01.txt
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

「backup」ディレクトリの中を確認すると「text.tar」ファイルが作成されていることが確認できます。

$ ls -lh ./backup
total 5.1M
-rw-rw-r-- 1 tamohiko tamohiko 5.1M Feb 17 16:41 text.tar

アーカイブと同時に圧縮したい場合

「z」オプションを使用すると、アーカイブを作成する際に「gzip」で圧縮も行ってくれます。

tar cfzv アーカイブ名.tar.gz ファイル1 ファイル2 ファイル3

「z」オプションを使用してアーカイブと「gzip」による圧縮を同時に行ってみます。

$ tar cfzv text.tar.gz text_01.txt text_02.txt text_03.txt dir_01/
text_01.txt
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

「gzip」で圧縮されたアーカイブファイル「text.tar.gz」が作成されました。

$ ls -l
total 6968
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 10:50 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_01.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_02.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_03.txt
-rw-rw-r-- 1 tamohiko tamohiko 3984809 Feb 17 10:53 text.tar.gz

アーカイブを展開

アーカイブを展開する場合、展開先に同じ名前のファイルやディレクトリがあると、強制的に上書きを行ってしまうので十分に展開先を確認してから作業を行ってください

「tar」でアーカイブされたファイルを展開する場合は、下記のコマンドを実行します。

tar xfv ファイル名.tar

指定しているオプションはそれぞれ下記の役割を持っています。

  • x アーカイブを展開
  • f アーカイブのファイル名指定
  • v 詳細なログを表示(任意)

展開実行例

「text.tar」というアーカイブファイルを展開します。

「v」オプションを使用しているので、展開されたファイルやディレクトリの情報も表示されています。

$ tar xfv text.tar 
text_01.txt
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

下記のように、アーカイブされていたファイルやディレクトリが展開されました。

なお、アーカイブされたファイルを展開しても、展開前のファイルはそのまま残ります。

$ ls -l
total 8208
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 16:41 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_01.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_02.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_03.txt
-rw-rw-r-- 1 tamohiko tamohiko 5253120 Feb 17 16:41 text.tar

「gzip」で圧縮されたアーカイブファイルを展開

「gzip」で圧縮されたアーカイブを展開する場合は、「z」オプションを使用します。

tar xfzv ファイル名.tar.gz

「text.tar.gz」という圧縮されたアーカイブファイルの展開を行います。

$ tar xfzv text.tar.gz 
text_01.txt
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

圧縮されたアーカイブファイルが展開することが出来ました。

$ ls -l
total 6968
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 16:41 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_01.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_02.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_03.txt
-rw-rw-r-- 1 tamohiko tamohiko 3984814 Feb 17 21:04 text.tar.gz

-C オプション 展開場所を指定

「-C」オプションを使用すると、指定したディレクトリに移動してから「tar」を実行することができます。

この機能使うことで、アーカイブファイルの展開場所を指定することが出来ます。

tar xfv アーカイブ.tar -C 展開場所のパス

「-C」オプションを使用して、ひとつ上の階層にある「restore」ディレクトリを展開場所として指定し、アーカイブの展開を行ってみます。

$ tar xzfv text.tar.gz -C ../restore/
text_01.txt
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

「../restore」ディレクトリ内を確認すると、アーカイブされていたファイルやディレクトリが展開されていました。

$ ls -l ../restore/
total 3076
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 16:41 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_01.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_02.txt
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_03.txt

k オプション 展開時に上書きしない

「k」オプションを使用すると、展開先に同じ名前のファイルやディレクトリがあった場合に、上書きを行わないようにすることが出来ます。

tar xfkv アーカイブ.tar
tar xfkzv アーカイブ.tar.gz

実際に同じ名前のファイルやディレクトリがある場所で、「k」オプションを使用してアーカイブファイルを展開してみます。

$ ls -l
total 4916
-rw-rw-r-- 1 tamohiko tamohiko 1048576 Feb 17 10:50 text_01.txt
-rw-rw-r-- 1 tamohiko tamohiko 3984814 Feb 17 21:04 text.tar.gz

$ tar xfkzv text.tar.gz 
text_01.txt
tar: text_01.txt: Cannot open: File exists
text_02.txt
text_03.txt
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt
tar: Exiting with failure status due to previous errors

「text_01.txt」については同名のファイルが存在していたため、上書きが行われず「Cannot open: File exists」というメッセージが表示されています。

その他のファイルやディレクトリについては、そのまま展開されています。

アーカイブ対象を絶対パス(フルパス)と相対パスで指定した際の違い

アーカイブする対象を指定する場合に、相対パスと絶対パス(フルパス)ではアーカイブ後のディレクトリ構造が異なります。

「/home/tamohiko/work/dir_01/」例にとって違いを見てみます。

相対パスで指定

「cd」で「/home/tamohiko/work」に移動した後に、アーカイブ対象を「./dir_01/」という形の相対パスで指定します。

$ cd /home/tamohiko/work
$ tar cfzv ./backup/dir_01.tar.gz ./dir_01/
./dir_01/
./dir_01/text_05.txt
./dir_01/text_04.txt

アーカイブされたファイルを展開してみます。

$ cd backup
$ tar xfzv dir_01.tar.gz 
./dir_01/
./dir_01/text_05.txt
./dir_01/text_04.txt

相対パスで指定した「dir_01」ディレクトリが展開されました。

$ ls -l
total 1564
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 16:41 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1594019 Feb 18 16:49 dir_01.tar.gz

ディレクトリの構成を「tree」コマンドで表示させてみると、相対パスとして指定したディレクトリと同じ構造で展開されていることがわかります。

$ tree ./
./
├── dir_01
│   ├── text_04.txt
│   └── text_05.txt
└── dir_01.tar.gz

意図しない上書きに注意

「tar」コマンドでアーカイブを展開する際、展開先を「-C」オプションで指定しない場合、アーカイブは「tar」コマンドを実行した場所(現在のディレクトリ)に展開されます。

例えば、「/home/tamohiko/work」ディレクトリ内で「dir_01.tar.gz」を展開すると、元からある「dir_01」ディレクトリは展開されたデータによって上書きされてしまいます。

そのため、相対パスでアーカイブ対象を指定した場合は、意図して上書きを行いたい場合を除いて、展開先に同じ名前のファイルやディレクトリが存在しないことを事前に確認することが重要です。

絶対パス(フルパス)で指定

「cd」で「/home/tamohiko/work」に移動した後に、アーカイブ対象を「/home/tamohiko/work/dir_01/」という形の絶対パスで指定します。

$ cd /home/tamohiko/work
$ tar cfzv ./backup/dir_01.tar.gz /home/tamohiko/work/dir_01/
tar: Removing leading `/' from member names
/home/tamohiko/work/dir_01/
/home/tamohiko/work/dir_01/text_05.txt
/home/tamohiko/work/dir_01/text_04.txt

「tar: Removing leading '/' from member names」というメッセージは、「tar」コマンドがアーカイブを作成する際に、ファイルパスの先頭にある「/」(スラッシュ)を取り除いたことを意味します。

これは、アーカイブを展開する際に、意図しない場所にファイルが展開されるのを防ぐための措置です。

例えば、今回のケースでは、「home/tamohiko/work/dir_01/」という相対パスでアーカイブされています。

もし、アーカイブ時に指定した「/home/tamohiko/work/dir_01/」という絶対パスのままアーカイブしてしまうと、展開先が常に「/home/tamohiko/work/dir_01/」となり、同じ場所の既存データを上書きしてしまいます。

絶対パスで指定されたアーカイブファイル「xfzv dir_01.tar.gz」を展開してみます。

$ cd ./backup
$ tar xfzv dir_01.tar.gz 
home/tamohiko/work/dir_01/
home/tamohiko/work/dir_01/text_05.txt
home/tamohiko/work/dir_01/text_04.txt

「home」というディレクトリが展開されています。

$ ls -l
total 1564
-rw-rw-r-- 1 tamohiko tamohiko 1594041 Feb 18 16:45 dir_01.tar.gz
drwxrwxr-x 3 tamohiko tamohiko    4096 Feb 18 16:46 home

「tree」コマンドでディレクトリ構造を表示すると、圧縮時に表示されたログと同じ「home/tamohiko/work/dir_01/」という形でアーカイブされていたことがわかります。

$ tree ./home/
./home/
└── tamohiko
    └── work
        └── dir_01
            ├── text_04.txt
            └── text_05.txt

4 directories, 2 files

-C オプションで相対パス指定する方法

「-C」オプションを使用すると、指定したディレクトリに移動してから「tar」コマンドを実行することが出来ます。

この機能使用すると、どのディレクトリにいても相対パスでアーカイブすることが出来ます。

下記のコマンドでは「-C」オプションで「/home/tamohiko/work」に移動したあとに、「dir_01」ディレクトリをアーカイブしています。

$ pwd
/home/tamohiko
$ tar cfzv dir_01.tar.gz -C /home/tamohiko/work dir_01/
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

アーカイブされた「dir_01.tar.gz」ファイルが作成されました。

$ ls -l
total 1564
-rw-rw-r-- 1 tamohiko tamohiko 1594014 Feb 18 21:03 dir_01.tar.gz
drwxrwxr-x 5 tamohiko tamohiko    4096 Feb 18 16:39 work

「dir_01.tar.gz」を展開してみます。

$ tar xfzv dir_01.tar.gz 
dir_01/
dir_01/text_05.txt
dir_01/text_04.txt

相対パスで指定した「dir_01」ディレクトリが出てきました。

$ ls -l
total 1568
drwxrwxr-x 2 tamohiko tamohiko    4096 Feb 17 16:41 dir_01
-rw-rw-r-- 1 tamohiko tamohiko 1594014 Feb 18 21:03 dir_01.tar.gz
drwxrwxr-x 5 tamohiko tamohiko    4096 Feb 18 16:39 work

「tree」コマンドでディレクトリ構造を表示すると、アーカイブ対象と指定したディレクトリ構造と同じであることが確認できました。

$ tree ./dir_01
./dir_01
├── text_04.txt
└── text_05.txt

1 directory, 2 files

コメント

タイトルとURLをコピーしました