このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

本日のtip その2:アーカイブにゴミや見せたくないファイルを入れない方法

ちょっとしたtipでも「ヘーッ」と思う人もいるようなので書いてみます、その2。Unix/Linux/Cygwin/MSYSとかでの話、GNU tarね。

tarは単一のファイルをアーカイブすることもできますが、普通はディレクトリを丸ごとアーカイブするでしょう。アーカイブに入れたくないファイルがあるとき、tarの--exclude=pattern、--exclude-from=file オプションを利用できます。patternはファイル名パターンで、シェルのワイルカード'?', '*'が使えます(ブレイス'{'と'}'は、期待通りには機能しませんから事実上使えません)。

例えば、

$ tar --exclude='*.tmp' -cvf ../archive.tar .

とすれば、*.tmp という名前のフィイルはアーカイブに入りません。--exclude='*.tmp' の代わりに --exclude '*.tmp' でも同じです。でも、--exclude *.tmp とクォートしないとシェルがその場でワイルドカード展開してしまって変なことになります。

--exclude='foo/*.tmp' なら、fooディレクトリの下にあり、名前が*.tmpにマッチするファイルはアーカイブに入りません。fooがディレクトリのとき、--exclude=foo と書くと、foo自身とその下のファイル全てが除外されます。--exclude=.svn が一番使いそうですね。--exclude=foo/ はなぜか効かないので注意してください。

ドットで始まる隠しファイル/ディレクトリを除外するために、--exclude='.*' なんて書くと何もアーカイブされないことになります。--exclude='*/.*' が使えます*1

複数の --excludeオプションを指定することもできます。

$ tar --exclude='*.tmp' --exclude='*/.*'  --exclude=foo \
  -cvf ../archive.tar .

--excludeの除外パターンがたくさんあると、コマンドラインが長くなるので、除外パターンをファイルに書いておくことができます。

*.tmp
*/.*
foo

上の内容のファイルを exclude.list として、次のようにできます。

$ tar --exclude-from=exclude.list -cvf ../archive.tar .

おっと、exclude.list も不要でした*2

$ tar --exclude=exclude.list --exclude-from=exclude.list \
  -cvf ../archive.tar .

*1:ここのパターマッチのメカニズムが、僕はわかってないんですけどね。

*2:exclude.listをexclude.list内に書いておいてもかまいません。