Linux、UNIXでアーカイブファイルに関するコマンドといえば、やはりtarコマンドだろう。
アーカイブファイルとは、多数のファイルをそのユーザ・グループ情報やパーミッション、タイムスタンプ等の情報と共に、一つにまとめたファイルのことだ。ただのアーカイブファイルだと圧縮までは行われないため、通常はgzipと組み合わせて圧縮もさせる。
今回はこのtarを作成するtarコマンドについて、覚えておくと便利な使い方を紹介する。
なお、使用したのはCentOS 7にインストールされている以下のバージョンとなる。
[root@test-centos7 ~]# tar --version tar (GNU tar) 1.26 Copyright (C) 2011 Free Software Foundation, Inc. 使用許諾 GPLv3+: GNU GPL version 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [参考訳] これはフリーソフトウェアです. 変更と再配布は自由です. 法律で認められる範囲で「無保証」です. 作者: John Gilmore, Jay Fenlason.
1.アーカイブファイルの作成
アーカイブファイルを作成する場合は、通常だと以下のようにコマンドを実行する。
なお、アーカイブに含める対象としてディレクトリを指定すると再帰的に含めてくれる。
tar cvf 作成するアーカイブファイル アーカイブに含めるファイルPATH ...
指定しているオプション「cvf」それぞれの意味は以下。
- c … アーカイブファイルを作成する
- v … 詳細の表示
- f … 作成するアーカイブファイル名を指定
gzipによる圧縮も同時に行う場合は、「z」オプションを付与する。
基本的には、こちらで覚えておけば問題ない。
tar czvf 作成するアーカイブファイル アーカイブに含めるファイルPATH ...
bz2による圧縮を行う場合は、「j」オプションを付与する。
tar cjvf 作成するアーカイブファイル アーカイブに含めるファイルPATH ...
[root@test-centos7 ~]# tar cvf /tmp/tar_test.tar /work/test12.* tar: メンバ名から先頭の `/' を取り除きます /work/test12.py /work/test12.py.old /work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar czvf /tmp/tar_test.tar.gz /work/test12.* tar: メンバ名から先頭の `/' を取り除きます /work/test12.py /work/test12.py.old /work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar cjvf /tmp/tar_test.tar.bz2 /work/test12.* tar: メンバ名から先頭の `/' を取り除きます /work/test12.py /work/test12.py.old /work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# ls -la /tmp/tar_test.* -rw-r--r--. 1 root root 20480 11月 25 08:20 /tmp/tar_test.tar -rw-r--r--. 1 root root 2107 11月 25 08:21 /tmp/tar_test.tar.bz2 -rw-r--r--. 1 root root 1838 11月 25 08:20 /tmp/tar_test.tar.gz [root@test-centos7 ~]# [root@test-centos7 ~]# file /tmp/tar_test.* /tmp/tar_test.tar: POSIX tar archive (GNU) /tmp/tar_test.tar.bz2: bzip2 compressed data, block size = 900k /tmp/tar_test.tar.gz: gzip compressed data, from Unix, last modified: Wed Nov 25 08:20:54 2015
2.アーカイブファイルの展開
アーカイブファイルを展開する場合は、以下のようにコマンドを実行する。
なお、展開したファイルはカレントディレクトリ配下に展開される。
tar xvf 展開するアーカイブファイルPATH
[root@test-centos7 ~]# ls -la /tmp/tar_test.* -rw-r--r--. 1 root root 20480 11月 25 08:20 /tmp/tar_test.tar -rw-r--r--. 1 root root 2107 11月 25 08:21 /tmp/tar_test.tar.bz2 -rw-r--r--. 1 root root 1838 11月 25 08:20 /tmp/tar_test.tar.gz [root@test-centos7 ~]# [root@test-centos7 ~]# file /tmp/tar_test.* /tmp/tar_test.tar: POSIX tar archive (GNU) /tmp/tar_test.tar.bz2: bzip2 compressed data, block size = 900k /tmp/tar_test.tar.gz: gzip compressed data, from Unix, last modified: Wed Nov 25 08:20:54 2015 [root@test-centos7 ~]# [root@test-centos7 ~]# tar xvf /tmp/tar_test.tar work/test12.py work/test12.py.old work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar xvf /tmp/tar_test.tar.gz work/test12.py work/test12.py.old work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar xvf /tmp/tar_test.tar.bz2 work/test12.py work/test12.py.old work/test12.sh
3.アーカイブファイルの展開先ディレクトリを指定する
アーカイブファイル展開時に、展開先のディレクトリを指定する場合は「-C」オプションにて指定することが出来る。
tar xvf 展開するアーカイブファイルPATH -C 展開先ディレクトリ
[root@test-centos7 ~]# pwd /root [root@test-centos7 ~]# tar xvf /tmp/tar_test.tar.gz -C /work4 work/test12.py work/test12.py.old work/test12.sh [root@test-centos7 ~]# ls -la /work4/ 合計 4 drwxr-xr-x. 3 root root 17 11月 25 14:32 . drwxr-xr-x. 33 root root 4096 11月 25 14:31 .. drwxr-xr-x. 2 root root 58 11月 25 14:32 work [root@test-centos7 ~]# [root@test-centos7 ~]# ls -la $(find /work4/ -type f) -rwxr-xr-x. 1 root root 4450 11月 3 07:36 /work4/work/test12.py -rwxr-xr-x. 1 root root 4450 11月 3 07:36 /work4/work/test12.py.old -rw-r--r--. 1 root root 573 10月 28 20:39 /work4/work/test12.sh
4.アーカイブファイルの中身をリスト表示する
アーカイブファイルの中身をリスト表示する場合は、「t」オプションを用いる。
tar tvf 中身を確認するアーカイブファイルPATH tar tvf 中身を確認するアーカイブファイルPATH アーカイブファイル内の表示させたいファイルPATH # 特定のファイルのみ表示させたい場合
[root@test-centos7 ~]# ls -la /tmp/tar_test.* -rw-r--r--. 1 root root 20480 11月 25 08:20 /tmp/tar_test.tar -rw-r--r--. 1 root root 2107 11月 25 08:21 /tmp/tar_test.tar.bz2 -rw-r--r--. 1 root root 1838 11月 25 08:20 /tmp/tar_test.tar.gz [root@test-centos7 ~]# [root@test-centos7 ~]# file /tmp/tar_test.* /tmp/tar_test.tar: POSIX tar archive (GNU) /tmp/tar_test.tar.bz2: bzip2 compressed data, block size = 900k /tmp/tar_test.tar.gz: gzip compressed data, from Unix, last modified: Wed Nov 25 08:20:54 2015 [root@test-centos7 ~]# [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.bz2 -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# # 特定のファイルのみを表示する場合(例:test12.pyのみ指定) [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py
5.アーカイブファイルから特定のファイルのみを展開させる
アーカイブファイルから、特定のファイルのみを展開させる場合は、以下のように引数として対象のファイルPATHを指定する。
tar xvf 展開するアーカイブファイルPATH 展開するファイル
[root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar xvf /tmp/tar_test.tar.gz work/test12.sh work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# ls -la work/ 合計 8 drwxr-xr-x. 2 root root 22 11月 25 14:37 . dr-xr-x---. 23 root root 4096 11月 25 14:37 .. -rw-r--r--. 1 root root 573 10月 28 20:39 test12.sh
6.アーカイブファイルにファイル・ディレクトリを追加する
既存のアーカイブファイルにファイルやディレクトリを追加する場合は、「r」オプションを付与する。
tar rvf 対象のアーカイブファイルPATH 追加するファイル・ディレクトリPATH
[root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar rvf /tmp/tar_test.tar.gz /work/test1*.sh tar: メンバ名から先頭の `/' を取り除きます /work/test10.sh /work/test11.sh /work/test12.sh /work/test13.sh /work/test14.sh /work/test15.sh /work/test16.sh /work/test17.sh /work/test18.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 96 2015-10-14 09:00 work/test10.sh -rw-r--r-- root/root 1168 2015-10-28 20:24 work/test11.sh -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 1276 2015-10-28 20:49 work/test13.sh -rw-r--r-- root/root 64363 2015-10-28 21:04 work/test14.sh -rw-r--r-- root/root 4871 2015-10-28 21:19 work/test15.sh -rw-r--r-- root/root 106 2015-10-28 21:48 work/test16.sh -rw-r--r-- root/root 3570 2015-10-28 22:09 work/test17.sh -rw-r--r-- root/root 88 2015-11-15 08:56 work/test18.sh
7.アーカイブファイルからファイル・ディレクトリを削除する
既存のアーカイブファイルからファイルやディレクトリを削除する場合は、「–delete」オプションを用いる。
tar vf 対象のアーカイブファイルPATH --delete 削除するファイル
[root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py -rwxr-xr-x root/root 4450 2015-11-03 07:36 work/test12.py.old -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 96 2015-10-14 09:00 work/test10.sh -rw-r--r-- root/root 1168 2015-10-28 20:24 work/test11.sh -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 1276 2015-10-28 20:49 work/test13.sh -rw-r--r-- root/root 64363 2015-10-28 21:04 work/test14.sh -rw-r--r-- root/root 4871 2015-10-28 21:19 work/test15.sh -rw-r--r-- root/root 106 2015-10-28 21:48 work/test16.sh -rw-r--r-- root/root 3570 2015-10-28 22:09 work/test17.sh -rw-r--r-- root/root 88 2015-11-15 08:56 work/test18.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar vf /tmp/tar_test.tar.gz --delete work/*.py* [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 96 2015-10-14 09:00 work/test10.sh -rw-r--r-- root/root 1168 2015-10-28 20:24 work/test11.sh -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 1276 2015-10-28 20:49 work/test13.sh -rw-r--r-- root/root 64363 2015-10-28 21:04 work/test14.sh -rw-r--r-- root/root 4871 2015-10-28 21:19 work/test15.sh -rw-r--r-- root/root 106 2015-10-28 21:48 work/test16.sh -rw-r--r-- root/root 3570 2015-10-28 22:09 work/test17.sh -rw-r--r-- root/root 88 2015-11-15 08:56 work/test18.sh
8.アーカイブファイル作成時に特定のファイルを除外する
アーカイブファイルを作成する際、ディレクトリを指定して再帰的に指定するが、特定のサブディレクトリだけは含めないようにしたい事があるだろう。
そんなときは、「-–exclude」オプションもしくは「-X」オプションを使用すると良いだろう。
tar cvf 作成するアーカイブファイルPATH --exclude 除外ディレクトリのPATH アーカイブ対象ディレクトリ # 除外対象をコマンドで指定する場合 tar cvf 作成するアーカイブファイルPATH -X 除外ディレクトリのPATHを書いたファイル アーカイブ対象ディレクトリ # 除外対象をファイルに記述する場合
[root@test-centos7 ~]# find /work8 -type d /work8 /work8/work8-1 /work8/work8-1/8-1-2 /work8/work8-1/8-1-3 /work8/work8-1/8-1-4 /work8/work8-2 /work8/work8-2/8-2-4 /work8/work8-2/8-2-2 /work8/work8-3 /work8/work8-4 /work8/work8-4/8-4-2 /work8/work8-4/8-4-1 /work8/work8-4/8-4-7 /work8/work8-5 /work8/work8-6 [root@test-centos7 ~]# tar czvf /tmp/test8.tar.gz --exclude /work8/work8-1 /work8 tar: メンバ名から先頭の `/' を取り除きます /work8/ /work8/work8-2/ /work8/work8-2/8-2-4/ /work8/work8-2/8-2-2/ /work8/work8-3/ /work8/work8-4/ /work8/work8-4/8-4-2/ /work8/work8-4/8-4-1/ /work8/work8-4/8-4-7/ /work8/work8-5/ /work8/work8-6/
9.アーカイブファイル内のPATHで、ワイルドカードやパターンを指定する
アーカイブファイル内のファイルやディレクトリを指定する際、色々な指定方法を使う事が出来る。
- –anchored … ファイル名の先頭とパターンが一致
- –ignore-case … 大文字小文字を無視
- –no-anchored … 任意の ‘/’ 以降にパターンが一致(標準で除外)
- –no-ignore-case … 大文字小文字を考慮して一致 (標準)
- –no-wildcards … 逐語的文字列一致
- –no-wildcards-match-slash … ワイルドカードが ‘/’に一致しない
- –wildcards … use wildcards (default)
- –wildcards-match-slash … ワイルドカードが ‘/’ に一致(標準で除外)
基本的にはワイルドカード(*)が有効になっているので、それで指定すると良いだろう。
10.アーカイブファイルと実際のファイルの差異を確認する
アーカイブファイルと実際のファイルの差異(といっても、ファイルサイズや最終更新日での比較だが)を確認する場合、「d」オプションを付与すると良いだろう。
そのまま実行するとカレントディレクトリ配下のファイルと比較するので、「-C」で比較先のディレクトリを指定すると良い。
tar dvf 比較するアーカイブファイル -C 比較先ディレクトリ
[root@test-centos7 ~]# pwd /root [root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 96 2015-10-14 09:00 work/test10.sh -rw-r--r-- root/root 1168 2015-10-28 20:24 work/test11.sh -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 1276 2015-10-28 20:49 work/test13.sh -rw-r--r-- root/root 64363 2015-10-28 21:04 work/test14.sh -rw-r--r-- root/root 4871 2015-10-28 21:19 work/test15.sh -rw-r--r-- root/root 106 2015-10-28 21:48 work/test16.sh -rw-r--r-- root/root 3570 2015-10-28 22:09 work/test17.sh -rw-r--r-- root/root 88 2015-11-15 08:56 work/test18.sh [root@test-centos7 ~]# ls -la /work/test1*.sh -rw-r--r--. 1 root root 96 10月 14 09:00 /work/test10.sh -rw-r--r--. 1 root root 1174 11月 25 18:40 /work/test11.sh -rw-r--r--. 1 root root 573 10月 28 20:39 /work/test12.sh -rw-r--r--. 1 root root 1276 10月 28 20:49 /work/test13.sh -rw-r--r--. 1 root root 64363 10月 28 21:04 /work/test14.sh -rw-r--r--. 1 root root 4871 10月 28 21:19 /work/test15.sh -rw-r--r--. 1 root root 106 10月 28 21:48 /work/test16.sh -rw-r--r--. 1 root root 3570 10月 28 22:09 /work/test17.sh -rw-r--r--. 1 root root 88 11月 15 08:56 /work/test18.sh [root@test-centos7 ~]# tar dvf /tmp/tar_test.tar.gz -C / work/test12.sh work/test10.sh work/test11.sh work/test11.sh: 最終修正時刻が異なります work/test11.sh: サイズが異なります work/test12.sh work/test13.sh work/test14.sh work/test15.sh work/test16.sh work/test17.sh work/test18.sh
11.アーカイブファイル内のファイルの中身を参照する
アーカイブファイル内のファイルを参照する場合は、「O」オプションを用いる。
中のファイルを指定しないとアーカイブファイル全体を参照してしまうので、必要に応じて中身を指定する。
tar xOf 対象のアーカイブファイル [参照するアーカイブファイル内のファイル]
[root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 96 2015-10-14 09:00 work/test10.sh -rw-r--r-- root/root 1168 2015-10-28 20:24 work/test11.sh -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 1276 2015-10-28 20:49 work/test13.sh -rw-r--r-- root/root 64363 2015-10-28 21:04 work/test14.sh -rw-r--r-- root/root 4871 2015-10-28 21:19 work/test15.sh -rw-r--r-- root/root 106 2015-10-28 21:48 work/test16.sh -rw-r--r-- root/root 3570 2015-10-28 22:09 work/test17.sh -rw-r--r-- root/root 88 2015-11-15 08:56 work/test18.sh [root@test-centos7 ~]# tar xOf /tmp/tar_test.tar.gz work/test18.sh get_date=`date +%d -d '1 day'` if [ $get_date = "01" ];then echo "月末です" fi
これを使うことで、アーカイブファイルの中身(ログファイルなど)に対しgrepを行う事も出来る。
12.展開したファイルを別のコマンドに引き渡す
展開したファイルを別のコマンドで処理する場合、「–to-command=」オプションを使う。
なお、コマンドに引き渡した場合はファイルの展開は行われないので注意する。
tar xvf 展開するアーカイブファイル --to-command=コマンド
引き渡すコマンド内で使用できる主な変数は以下。
- $TAR_MODE … アーカイブファイル内のパーミッション
- $TAR_FILENAME … アーカイブファイル内のファイル名
- $TAR_UNAME … アーカイブファイル内のファイルのオーナー名
- $TAR_UID … アーカイブファイル内のファイルのオーナーID
- $TAR_GNAME … アーカイブファイル内のファイルのグループ名
- $TAR_GID … アーカイブファイル内のファイルのグループID
- $TAR_SIZE … アーカイブファイル内のファイルサイズ
例えば、アーカイブファイルから展開するファイルPATHを取得して、オリジナルファイルをlsで見る場合だと、以下のようにコマンドを実行する。
[root@test-centos7 ~]# tar tvf /tmp/tar_test.tar.gz -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 96 2015-10-14 09:00 work/test10.sh -rw-r--r-- root/root 1168 2015-10-28 20:24 work/test11.sh -rw-r--r-- root/root 573 2015-10-28 20:39 work/test12.sh -rw-r--r-- root/root 1276 2015-10-28 20:49 work/test13.sh -rw-r--r-- root/root 64363 2015-10-28 21:04 work/test14.sh -rw-r--r-- root/root 4871 2015-10-28 21:19 work/test15.sh -rw-r--r-- root/root 106 2015-10-28 21:48 work/test16.sh -rw-r--r-- root/root 3570 2015-10-28 22:09 work/test17.sh -rw-r--r-- root/root 88 2015-11-15 08:56 work/test18.sh [root@test-centos7 ~]# [root@test-centos7 ~]# tar xvf /tmp/tar_test.tar.gz --to-command='ls -la /$TAR_FILENAME' work/test12.sh -rw-r--r--. 1 root root 573 10月 28 20:39 /work/test12.sh work/test10.sh -rw-r--r--. 1 root root 96 10月 14 09:00 /work/test10.sh work/test11.sh -rw-r--r--. 1 root root 1174 11月 25 18:40 /work/test11.sh work/test12.sh -rw-r--r--. 1 root root 573 10月 28 20:39 /work/test12.sh work/test13.sh -rw-r--r--. 1 root root 1276 10月 28 20:49 /work/test13.sh work/test14.sh -rw-r--r--. 1 root root 64363 10月 28 21:04 /work/test14.sh work/test15.sh -rw-r--r--. 1 root root 4871 10月 28 21:19 /work/test15.sh work/test16.sh -rw-r--r--. 1 root root 106 10月 28 21:48 /work/test16.sh work/test17.sh -rw-r--r--. 1 root root 3570 10月 28 22:09 /work/test17.sh work/test18.sh -rw-r--r--. 1 root root 88 11月 15 08:56 /work/test18.sh
13.sshコマンドと組み合わせる
sshコマンドと組み合わせる事で、ローカルのファイルをアーカイブした状態でscp転送したり、その逆も行う事ができる。
詳細についてはリンク先で記述しているので、そちらを参照してもらいたい。
#【ローカル→リモート】ローカルでファイル・フォルダを圧縮し、リモートでアーカイブファイルとして保持させる tar zcvf - /アーカイブ化したいディレクトリのパス | ssh ユーザ名@リモートホスト "cat > /リモート側で作成するアーカイブ・ファイルのパス #【ローカル→リモート】ローカルのアーカイブファイルをリモートで解凍する ssh ユーザ名@リモートホスト "tar zxvf -C リモート側で展開させたいフォルダ -" < /リモート側で解凍させたいアーカイブファイルのパス #【リモート→ローカル】リモートでファイル・フォルダを圧縮し、ローカルでアーカイブファイルとして保持させる ssh ユーザ名@リモートホスト "tar -cf - /アーカイブ化したいディレクトリのパス" | gzip > /ローカル側で作成するアーカイブ・ファイルのパス #【リモート→ローカル】リモートのアーカイブファイルをローカルで解凍する ssh ユーザ名@リモートホスト "cat /ローカル側で解凍させたいアーカイブファイル" | tar zxvf - -C ローカル側で展開させたいフォルダ
以上、この他にも使い方は色々あると思うが、最低限この辺を覚えておけばそんなに困らないであろう。
