tarコマンドで「一部のファイルやディレクトリを除外」したい!どうすればいい?

Linuxテクニック

tarコマンドを使って「一部のファイルやディレクトリを除外」してアーカイブファイルの作成と展開を行う方法を、例を用いて解説します。

一部のファイルを除外してtarアーカイブを作成する

tarコマンドに「–exclude パターン」を指定することで、ファイルを処理対象から除外できます。

「パターン」には、ファイル名やディレクトリ名を指定します。「*」「?」「[…]」といったワイルドカードを用いて指定することもできます

例えば、カレントディレクトリに以下のような構成の「tar-test」ディレクトリがあるとします。

$ tree tar-test/
tar-test/
├── test_1
│   ├── test_1
│   │   ├── test_1.txt
│   │   ├── test_2.txt
│   │   └── test_x.txt
│   ├── test_2
│   │   ├── test_1.txt
│   │   ├── test_2.txt
│   │   └── test_x.txt
│   └── test_x
│       ├── test_1.txt
│       ├── test_2.txt
│       └── test_x.txt
├── test_2
│   ├── test_1
│   │   ├── test_1.txt
│   │   ├── test_2.txt
│   │   └── test_x.txt
│   ├── test_2
│   │   ├── test_1.txt
│   │   ├── test_2.txt
│   │   └── test_x.txt
│   └── test_x
│       ├── test_1.txt
│       ├── test_2.txt
│       └── test_x.txt
└── test_x
    ├── test_1
    │   ├── test_1.txt
    │   ├── test_2.txt
    │   └── test_x.txt
    ├── test_2
    │   ├── test_1.txt
    │   ├── test_2.txt
    │   └── test_x.txt
    └── test_x
        ├── test_1.txt
        ├── test_2.txt
        └── test_x.txt

12 directories, 27 files

以下のコマンドで、これらのディレクトリやファイルすべてを「/tmp/tar-test.tar.gz」にアーカイブできます。

$ tar -zcvf /tmp/tar-test.tar.gz tar-test/

次の例のように、「–exclude test_2」を加えて実行すると、名前が「test_2」に一致するファイルやディレクトリを除外してtarアーカイブを作成できます。

$ tar --exclude test_2 -zcvf /tmp/test.tar.gz tar-test/
tar-test/
tar-test/test_x/
tar-test/test_x/test_x/
tar-test/test_x/test_x/test_2.txt
tar-test/test_x/test_x/test_1.txt
tar-test/test_x/test_x/test_x.txt
tar-test/test_x/test_1/
tar-test/test_x/test_1/test_2.txt
tar-test/test_x/test_1/test_1.txt
tar-test/test_x/test_1/test_x.txt
tar-test/test_1/
tar-test/test_1/test_x/
tar-test/test_1/test_x/test_2.txt
tar-test/test_1/test_x/test_1.txt
tar-test/test_1/test_x/test_x.txt
tar-test/test_1/test_1/
tar-test/test_1/test_1/test_2.txt
tar-test/test_1/test_1/test_1.txt
tar-test/test_1/test_1/test_x.txt

このように、「tar-test/test_2/」「tar-test/test_1/test_2/」「tar-test/test_x/test_2/」ディレクトリ以下が除外されます。なお、各ディレクトリにある「test_2.txt」は除外されていません。

次の例のように、「–exclude “test_2*”」と指定すると、名前が「test_2*」に一致するファイルやディレクトリを除外してtarアーカイブを作成できます。

$ tar --exclude "test_2*" -zcvf /tmp/test.tar.gz tar-test/
tar-test/
tar-test/test_x/
tar-test/test_x/test_x/
tar-test/test_x/test_x/test_1.txt
tar-test/test_x/test_x/test_x.txt
tar-test/test_x/test_1/
tar-test/test_x/test_1/test_1.txt
tar-test/test_x/test_1/test_x.txt
tar-test/test_1/
tar-test/test_1/test_x/
tar-test/test_1/test_x/test_1.txt
tar-test/test_1/test_x/test_x.txt
tar-test/test_1/test_1/
tar-test/test_1/test_1/test_1.txt
tar-test/test_1/test_1/test_x.txt

このように指定することで、「test_2.txt」も除外されます。

次の例のように、「–exclude “test_[12]*”」と指定すると、名前が「test_[12]*」に一致するファイルやディレクトリを除外してtarアーカイブを作成できます。

$ tar --exclude "test_[12]*" -zcvf /tmp/test.tar.gz tar-test/
tar-test/
tar-test/test_x/
tar-test/test_x/test_x/
tar-test/test_x/test_x/test_x.txt

このように、名前が「test_1」および「test_2」で始まるファイルやディレクトリがすべて除外されました。

次の例のように「–exclude」を複数指定することもできます。

$ tar --exclude "test_1/test_*/test_[12]*" --exclude "test_x/test_*/test_x*" -zcvf /tmp/test.tar.gz tar-test/
tar-test/
tar-test/test_2/
tar-test/test_2/test_2/
tar-test/test_2/test_2/test_2.txt
tar-test/test_2/test_2/test_1.txt
tar-test/test_2/test_2/test_x.txt
tar-test/test_2/test_x/
tar-test/test_2/test_x/test_2.txt
tar-test/test_2/test_x/test_1.txt
tar-test/test_2/test_x/test_x.txt
tar-test/test_2/test_1/
tar-test/test_2/test_1/test_2.txt
tar-test/test_2/test_1/test_1.txt
tar-test/test_2/test_1/test_x.txt
tar-test/test_x/
tar-test/test_x/test_2/
tar-test/test_x/test_2/test_2.txt
tar-test/test_x/test_2/test_1.txt
tar-test/test_x/test_x/
tar-test/test_x/test_x/test_2.txt
tar-test/test_x/test_x/test_1.txt
tar-test/test_x/test_1/
tar-test/test_x/test_1/test_2.txt
tar-test/test_x/test_1/test_1.txt
tar-test/test_1/
tar-test/test_1/test_2/
tar-test/test_1/test_2/test_x.txt
tar-test/test_1/test_x/
tar-test/test_1/test_x/test_x.txt
tar-test/test_1/test_1/
tar-test/test_1/test_1/test_x.txt

一部のファイルを除外してtarアーカイブを展開する

アーカイブファイルの作成時と同じように、展開時にも「–exclude」オプションを用いることができます。

指定方法は、アーカイブファイルを作成する場合と同様です。以下の例では、「test_2.txt」を除外しています。

$ tar --exclude test_2.txt -zxvf /tmp/tar-test.tar.gz
tar-test/
tar-test/test_2/
tar-test/test_2/test_2/
tar-test/test_2/test_2/test_1.txt
tar-test/test_2/test_2/test_x.txt
tar-test/test_2/test_x/
tar-test/test_2/test_x/test_1.txt
tar-test/test_2/test_x/test_x.txt
tar-test/test_2/test_1/
tar-test/test_2/test_1/test_1.txt
tar-test/test_2/test_1/test_x.txt
tar-test/test_x/
tar-test/test_x/test_2/
tar-test/test_x/test_2/test_1.txt
tar-test/test_x/test_2/test_x.txt
tar-test/test_x/test_x/
tar-test/test_x/test_x/test_1.txt
tar-test/test_x/test_x/test_x.txt
tar-test/test_x/test_1/
tar-test/test_x/test_1/test_1.txt
tar-test/test_x/test_1/test_x.txt
tar-test/test_1/
tar-test/test_1/test_2/
tar-test/test_1/test_2/test_1.txt
tar-test/test_1/test_2/test_x.txt
tar-test/test_1/test_x/
tar-test/test_1/test_x/test_1.txt
tar-test/test_1/test_x/test_x.txt
tar-test/test_1/test_1/
tar-test/test_1/test_1/test_1.txt
tar-test/test_1/test_1/test_x.txt
Linuxテクニック
\シェアお願いします/
LFI

コメント

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