展開先の指定 †# tar zxvf /home1/log_user/tmp.tar.gz -C /home1/log_user 特定のディレクトリ、ファイルを除外 †# tar cvf /home/user/hogehoge.tar /hogehoge --exclude "*snapshot*" --exclude "tmp" 権限、所有者をそのままにしてtarする †# tar cvf /home/user/tmp.tar -p /home/user/tmp tarで固めたファイルに追加する †# tar cf /home/user/tmp.tar /home/user/tmp # tar rf /home/user/tmp.tar /home/user/hoge
tarを展開せずに中身を確認する †# tar tvf /home/user/tmp.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 要点は # 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を入れることで、すでにあるファイルを上書きしない、と言う結果になる。 TIPS: # tar xvfk a.tar -C ./ > ./tar.log 2> error.log tarをcpの様に使う †説明をすると、コピー元に階層の深い場所に目的のファイルがあり、コピー先にも同じ名前の階層に同じファイルをコピーしたくても、 # cp -p /a/b/c/123.txt /a_bak/a/b/c/123.txt そこで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の展開先を変換する(置換) †tarでディレクトリを固めた後に、展開先のパスを直したくなった場合、再度取り直す必要はない。 例えば以下のようなディレクトリをtarで固めた場合 # pwd # ls # 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 当然これも上記のようになる。 これをオプションで"home/work"の部分を変換(置換)し、相対パスで展開することが可能。 ①--strip-componentsを使用する # tar xvf a.tar --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を使用する # tar xvf a.tar --transform='s/home\/work/work_test/g' # tree work_test/ work_test/ `-- a |-- b | `-- c | |-- 123.txt | `-- 456.txt `-- test |