アーカイブに不要なファイルを含めたくない

ログファイルや.gitディレクトリなど、アーカイブに含める必要のないファイルが混ざっている場合がある。すべてを含めてアーカイブを作成すると容量が無駄に大きくなったり、展開先に不要なファイルが残ったりする。tarコマンドの--excludeオプションを使うと、アーカイブ作成時・展開時の両方で特定のファイルやディレクトリを対象から除外できる。

–exclude オプションの基本

--exclude=PATTERNを指定すると、PATTERNにマッチするファイル・ディレクトリをアーカイブの対象から除外する。

$ tar -czf archive.tar.gz --exclude=PATTERN directory/

シェルによるワイルドカード展開を防ぐため、PATTERNはクォートで囲む。

具体例

以下のような構造のmyprojectディレクトリがあるとする。

myproject/
├── src/
│   ├── main.go
│   └── utils.go
├── config/
│   └── app.yaml
├── logs/
│   ├── debug.log
│   └── error.log
└── README.md

*.logファイルを除外してアーカイブを作成する。

$ tar -czf myproject.tar.gz --exclude="*.log" myproject/

作成されたアーカイブの中身を-tオプションで確認する。

$ tar -tf myproject.tar.gz
myproject/
myproject/README.md
myproject/logs/
myproject/src/
myproject/src/utils.go
myproject/src/main.go
myproject/config/
myproject/config/app.yaml

logs/debug.loglogs/error.logが除外されている。logs/ディレクトリ自体は*.logパターンにマッチしないため、中身が空のディレクトリエントリとしてアーカイブに残る。

複数のパターンを除外する

--excludeは複数回指定でき、指定したすべてのパターンを組み合わせて除外できる。

$ tar -czf myproject.tar.gz --exclude="*.log" --exclude="myproject/config" myproject/
$ tar -tf myproject.tar.gz
myproject/
myproject/README.md
myproject/logs/
myproject/src/
myproject/src/utils.go
myproject/src/main.go

*.logファイルに加えてmyproject/configディレクトリがまるごと除外されている。

パスの区切りを含まないパターンの挙動

/を含まないパターンを指定すると、アーカイブ内のパスのどの階層にあるディレクトリ名・ファイル名に対してもマッチする。

$ tar -czf myproject.tar.gz --exclude="logs" myproject/
$ tar -tf myproject.tar.gz
myproject/
myproject/README.md
myproject/src/
myproject/src/utils.go
myproject/src/main.go
myproject/config/
myproject/config/app.yaml

myproject/logsという完全なパスを指定していないが、logsという名前のディレクトリが除外される。--excludeはパスの先頭からの一致(アンカリング)を行わず、パス中の各階層に対してパターンマッチを試みるため、意図せず同名の別のディレクトリ・ファイルまで除外される場合がある。特定の階層だけを除外したい場合はmyproject/configのように/を含めてパスを指定する。

展開時にファイルを除外する

--excludeは展開(-x)時にも同様に使用でき、アーカイブ内の一部のファイルだけを展開対象から除外できる。

$ mkdir extract
$ tar -xzf myproject.tar.gz -C extract --exclude="*.log"
$ find extract -type f
extract/myproject/README.md
extract/myproject/config/app.yaml
extract/myproject/src/main.go
extract/myproject/src/utils.go

logs/配下の.logファイルが展開されず、それ以外のファイルだけが展開される。

–exclude-from でパターンをファイルにまとめる

除外したいパターンが多い場合は、--exclude-fromオプションでパターンを1行ずつ記述したファイルを指定できる。

*.log
myproject/config
$ tar -czf myproject.tar.gz --exclude-from=excludes.txt myproject/

--excludeを複数回指定するのと同じ結果になる。除外パターンの数が多い場合や、他のコマンドと共通のパターンを使い回したい場合に扱いやすい。

関連記事