tarで一部のファイル/ディレクトリを除外してアーカイブする

tarコマンドで何かアーカイブする時、「ログファイルが大きいから、apps/log ディレクトリだけは除外したい」など特定のファイルやディレクトリを除外したいときは --exclude オプションを使う。

以下のように、appsというディレクトリ配下に[apple], [banana]というディレクトリがあり、それぞれサブディレクトリ[analog], [bin], [log]を持っている場合を考える。

macbook:tmp ozuma$ ls -F apps/*
apps/apple:
analog/     bin/     log/

apps/banana:
analog/     bin/     log/

この場合、logディレクトリだけ除外したければ --exclude log としてやる。

macbook:tmp ozuma$ tar cvf apps.tar --exclude log apps
a apps
a apps/apple
a apps/banana
a apps/banana/analog
a apps/banana/bin
a apps/apple/analog
a apps/apple/bin

excludeオプションはパターンマッチも出来るので、analogディレクトリも除外したい場合は "*log"としてやれば良い。

macbook:tmp ozuma$ tar cvf apps.tar --exclude "*log" apps
a apps
a apps/apple
a apps/banana
a apps/banana/bin
a apps/apple/bin

これで、[log]と[analog]の両方が除外された。

excludeオプションで指定すると該当する名前が全て対象となるので、「apple/log/ は除外するけど banana/log/ は除外して欲しくない」時には困る。こういう場合は、パス指定してやれば良い。

macbook:tmp ozuma$ tar cvf apps.tar --exclude ./apple/log apps
a apps
a apps/apple
a apps/banana
a apps/banana/analog
a apps/banana/bin
a apps/banana/log
a apps/apple/analog
a apps/apple/bin

これで、apple/log/はアーカイブされず、banana/log/ はアーカイブされた。

では、除外するファイルがいっぱいある場合はどうするか。この場合は、excludeする名前一覧をテキストファイルで書いておいて、これを読み込んで除外設定する -X オプションを使えば良い。

macbook:tmp ozuma$ cat tar_ex.conf
apple/analog
banana/log
banana/bin

macbook:tmp ozuma$ tar cvf apps.tar -X tar_ex.conf apps/
a apps
a apps/apple
a apps/banana
a apps/banana/analog
a apps/apple/bin
a apps/apple/log

上記の例では、[apple/analog], [banana/log], [banana/bin] の3つを除外してみた。