読者です 読者をやめる 読者になる 読者になる

部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

特定ディレクトリを除外してtarアーカイブを作る

何をしたいかというと、

[bata64@Server ~]$ find pl
pl
pl/総合順位表.csv
pl/ShinMasuzawa
pl/ShinMasuzawa/config
pl/ShinMasuzawa/config/config.pl
pl/ShinMasuzawa/config/config.BAK
pl/ShinMasuzawa/Build.PL
~中略~
pl/Masuzawa
pl/Masuzawa/EXCEL_TEST
pl/Masuzawa/EXCEL_TEST/新増沢方式審査用紙tmp.csv
pl/Masuzawa/EXCEL_TEST/新増沢方式審査用紙.csv
pl/Masuzawa/EXCEL_TEST/新増沢方式審査用紙.xlsx
pl/Masuzawa/EXCEL_TEST/新増沢方式審査用紙tmp.xlsx
pl/Masuzawa/EXCEL_TEST/Bata
pl/Masuzawa/EXCEL_TEST/Bata/GetData.BAK
pl/Masuzawa/EXCEL_TEST/Bata/GetData.pm
pl/Masuzawa/EXCEL_TEST/Bata/CSV.BAK
~略~

という構造のplディレクトリをtarアーカイブしたい場合、

[bata64@Server ~]$ tar cf /var/tmp/pl.tar pl

とすれば良いですが、当然plディレクトリ以下の全てのディレクトリ、ファイルを含めたアーカイブファイルである「pl.tar」が出来上がります。

このとき、「pl/Masuzawa」以下のディレクトリとファイル以外をtarアーカイブしたい場合は以下のようにします。

除外ディレクトリを書いたテキストファイル(除外ディレクトリ記載ファイル)を用意する

[bata64@Server ~]$ vi ~bata64/xfile

とかで編集し、

pl/Masuzawa

と記入します。複数ある場合は改行区切りで、

pl/Masuzawa
pl/sirakaba/aozora/minamikaze
pl/sen/masao

みたいに書いていけば良いです。

  • 絶対パスではなく該当ディレクトリ以下のみ記述
  • 余計な空白、改行があるとエラー出さずに失敗(除外されない)するようですのでご注意ください。

がポイントです。

除外ディレクトリ記載ファイルを指定してtarアーカイブ作成

plディレクトリの直上ディレクトリに移動します。

plディレクトリの絶対パス

/export/home/bata64/pl

である場合、

/export/home/bata64/

に移動する、という事です。
その上で、-Xオプションをつけて除外ディレクトリ記載ファイルを指定してtarアーカイブを作成します。

[bata64@Server ~]$ tar cfX /var/tmp/pl.tar ~bata64/xfile pl

これでOK。本当に除外されているかどうかを知りたければ-vオプションつけて

[bata64@Server ~]$ tar cfvX /var/tmp/pl.tar ~bata64/xfile pl

として標準出力を目視でがんばるか、出来上がったtarアーカイブを-tオプションで眺めればよいと思います。

[bata64@Server ~]$ tar tfv /var/tmp/pl.tar

注意点

私はSolarisだいすきっ子ですので以下の環境で試しました。

SPARC Solaris10 1/13
SPARC Solaris8 10/01

すると、

  • Solaris10の場合/usr/sfw/bin/gtarでは成功
  • Solaris8に別途インストールしたGNU tar(バージョン1.13)ではエラーが出ず成功したように見えるが除外されていない
  • Solaris8のOSバンドル tarでは成功

という結果になりました。Solarisで試して上手く行かないなー、という方はtarのバージョンとかを疑ってみてはいかがでしょう。

なお、カーネル2.6台のLinuxとかSolaris11にバンドルされているGNU tarの場合は大体成功します(というかいまどきのOSであれば大体大丈夫でしょう)。

余談

この機能、除外ディレクトリ記載ファイルの書き方まで解説してくれてるサイトがなかなか見つからなかったので、会社のベテランSolaris大好きおじさんと一緒に検証してみました。

ではー。