2012年12月8日土曜日

tarのexcludeオプションにハマった


Linuxがつくづく手放せない @snicker_jp です。

アーカイブに含めない、ファイル、ディレクトリのパターンを指定する「exclude」オプションですが、なかなか詳しく載っているサイトがなかったので、書き残します。


もくじ


前提条件


  • Linux
  • GNU tar

ssh経由でtarを取ってバックアップ!なんてよくやったりしますよね。

こんな感じ。↓

ssh root@[サーバー] "tar --one-file-system --sparse -C / -zcf - . "  > backup.tar.gz

除外を入れると、こんな感じ。↓

ssh root@[サーバー] "tar --one-file-system --sparse -C / --exclude 'gomi/kore' -zcf - . "  > backup.tar.gz

複数指定したくなります。

ダメ

ssh root@[サーバー] "tar --one-file-system --sparse -C / --exclude 'gomi/kore' 'gomi/koremo' -zcf - . "  > backup.tar.gz
↑これは使えません。

OK

ssh root@[サーバー] "tar --one-file-system --sparse -C / --exclude 'gomi/kore' --exclude 'gomi/koremo' -zcf - . "  > backup.tar.gz
こうしないと、いけません。「--exclude」を除外したい分だけ書きます。

応用編(シェルスクリプト)

#対象ホストIPとか
IP_ADDRESS="[サーバー] "

# 除外したいもの(複数)
EXCLUDES=" \
  './home/hoge/Trash/*' \
  './home/huga/bigdata_tmp.*' \
  './var/tmp' \
  "
# -----------------------------------------------------------------------------
#   function
# -----------------------------------------------------------------------------

# メイン
#

function main() {

    local excludes=""
    local exclude=""
    for exclude in ${EXCLUDES}
    do
        excludes="${excludes} --exclude ${exclude}"
    done

    ssh root@${IP_ADDRESS} "tar --one-file-system --sparse -C / ${excludes} -zcf - . "  > backup.tar.gz
}

これで、いくつも書かなくて済みます!w

オプション(-X, --exclude-from=file)

tar zcf hogehoge.tar.gz hoge --exclude-from=【FILE】
のように書いて、【FILE】に書かれたファイル および ディレクトリ一覧を除外します。

./workspace
*-log/build-log
exlude-file
などとすれば、「"(ダブルクオーテーション)」なしで正規表現が通りました!

(」・ω・)」うー!(/・ω・)/にゃー!

Zenback