Custom Search

JITAKU_SVR_Wiki



展開先の指定

# tar zxvf /home1/log_user/tmp.tar.gz -C /home1/log_user

特定のディレクトリ、ファイルを除外

# tar cvf /home/user/hogehoge.tar /hogehoge --exclude "*snapshot*" --exclude "tmp"
hogehoge.tarに/hogehogeをアーカイブする。
ただし、snapshot、tmpというディレクトリ、ファイル名があった場合には除外する。
複数書きたい場合はその都度excludeを追加する。

権限、所有者をそのままにしてtarする

# tar cvf /home/user/tmp.tar -p /home/user/tmp

tarで固めたファイルに追加する

# tar cf /home/user/tmp.tar /home/user/tmp
→tarボール作成

# tar rf /home/user/tmp.tar /home/user/hoge
→作成したtarボール(tmp.tar)にhogeディレクトリを追加する
※tmp.tarの最後に追加する形になるので、たくさんのディレクトリ、
ファイルの詰まったtarに追加すると、さらに時間がかかるので注意



tarを展開せずに中身を確認する

# tar tvf /home/user/tmp.tar

tarを展開するときに上書きをしない

tarで固めたファイルが移行先にすでに存在していた場合上書きをしない。
例)
tarの中身

# tar tvf a.tar | awk '{ print $6 }'
a/
a/b/
a/b/bb
a/b/c/
a/b/c/d/
a/b/c/d/e/
a/b/c/d/e/f/
a/b/c/d/e/f/g/
a/b/c/d/e/f/g/h/
a/b/c/d/e/f/g/h/i/
a/b/c/d/e/f/g/h/i/j/
a/b/c/d/e/f/g/h/i/j/k/
a/b/c/d/e/f/g/h/i/j/k/last.tar
a/aa

展開先ディレクトリ

# tree a/
a/
|-- aa
`-- b
    |-- bb
    `-- c
        `-- d
            `-- e
                `-- f
                    `-- g
                        `-- h
                            `-- i
                                `-- j
                                    `-- k
                                        

要点は
・a/aaファイルが存在するので上書きさせない
・a/b/bbファイルが存在するので上書きさせない
・a/b/c/d/e/f/g/h/i/j/k/last.tarが存在しないので、展開する

# tar xfk a.tar -C ./ 2>&1 | tee tar.log

# cat tar.log

tar: a/b/bb: Cannot open: File exists
tar: a/aa: Cannot open: File exists
tar: Exiting with failure status due to previous errors

tarコマンドのオプションにkを入れることで、すでにあるファイルを上書きしない、と言う結果になる。
コマンドの実行結果をログに吐いているので見てみると、aa、bbファイルは存在しているので展開しなかった。
last.tarがなかったので展開した。

TIPS:
ログの取り方について

# tar xvfk a.tar -C ./ > ./tar.log 2> error.log
こうしておくと、展開している時のverboseがtar.logにリダイレクトされ、error.logにファイルが既にあり、展開しなかった時のログを出力させる。

tarをcpの様に使う

説明をすると、コピー元に階層の深い場所に目的のファイルがあり、コピー先にも同じ名前の階層に同じファイルをコピーしたくても、
cpコマンドだと、途中のディレクトリ、リンクを持っていくことが出来ない。
つまり、↓の様な時

# cp -p /a/b/c/123.txt /a_bak/a/b/c/123.txt
a_bakディレクトリにコピー元と同じ階層とファイルを持っていきたい。
しかし、cpコマンドでは無理。(オプションを変えても無理)

そこでtarを使ってコピーをする。

# tar cf - /a/b/c/123.txt | ( cd /a_bak/ ; tar xvf -)
サブシェルを使いたくない人は、

# tar cf - /a/b/c/123.txt | tar xvf - -C /a_bak/
でも大丈夫だと思う(未検証)

TIPS:
tar cf(xvf) - のハイフンは標準出力に吐くという意味。
実際にtarで固めている訳ではないので、標準出力に吐く。

tarの展開先を変換する(置換)

tarでディレクトリを固めた後に、展開先のパスを直したくなった場合、再度取り直す必要はない。

例えば以下のようなディレクトリをtarで固めた場合

# pwd
/home/work/test

# ls
a

# tree a
a
|-- b
|   `-- c
|       |-- 123.txt
|       `-- 456.txt
`-- test

# tar a.tar /home/work/test/a

# tar tvf a.tar

drwxr-xr-x user1/user1       0 2013-08-12 11:30 home/work/a/
drwxr-xr-x user1/user1       0 2013-08-08 16:24 home/work/a/b/
drwxr-xr-x user1/user1       0 2013-08-08 17:20 home/work/a/b/c/
-rw-r--r-- user1/user1       0 2013-08-08 17:20 home/work/a/b/c/456.txt
-rw-r--r-- user1/user1       0 2013-08-08 16:24 home/work/a/b/c/123.txt
drwxr-xr-x root/root         0 2013-08-12 11:28 home/work/a/test/

当然こうなる。
これを展開すると・・・。

# tar xvf a.tar

home/work/a/
home/work/a/b/
home/work/a/b/c/
home/work/a/b/c/456.txt
home/work/a/b/c/123.txt
home/work/a/test/

# ls
a.tar home

当然これも上記のようになる。

これをオプションで"home/work"の部分を変換(置換)し、相対パスで展開することが可能。

①--strip-componentsを使用する

# tar xvf a.tar --strip-components=2
この"--strip-components=2"が展開するパスの深さを示し、除外したいディレクトリを取っ払ってくれる。

# tar xvf a.tar --strip-components=2
home/work/a/
home/work/a/b/
home/work/a/b/c/
home/work/a/b/c/456.txt
home/work/a/b/c/123.txt
home/work/a/test/
# ls
a a.tar
# tree a
a
|-- b
|   `-- c
|       |-- 123.txt
|       `-- 456.txt
`-- test

展開中のログには"home/work"と表示されてしまうが、実際に展開すると上記の様に上から2つ目までディレクトリをはずしてくれる。

②--transformを使用する
①とやれることは同じだが、展開先をsedのように置換することも出来る。

# tar xvf a.tar --transform='s/home\/work/work_test/g'
home/work/a/
home/work/a/b/
home/work/a/b/c/
home/work/a/b/c/456.txt
home/work/a/b/c/123.txt
home/work/a/test/

# tree work_test/
work_test/
`-- a
    |-- b
    |   `-- c
    |       |-- 123.txt
    |       `-- 456.txt
    `-- test

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-17 (木) 17:26:38 (648d)