打开目录,但不要在存档中存储完整的绝对path
我在备份shell脚本的部分有以下命令:
tar -cjf site1.bz2 /var/www/site1/
当我列出档案的内容时,我得到:
tar -tf site1.bz2 var/www/site1/style.css var/www/site1/index.html var/www/site1/page2.html var/www/site1/page3.html var/www/site1http://img.dovov.comimg1.png var/www/site1http://img.dovov.comimg2.png var/www/site1/subdir/index.html
但是我想从档案中的目录和文件名删除部分/var/www/site1
,以简化提取并避免无用的常量目录结构。 永远不知道,以防万一我会提取备份网站的网站数据不存储在/var/www
。
对于上面的例子,我想有:
tar -tf site1.bz2 style.css index.html page2.html page3.html images/img1.png images/img2.png subdir/index.html
所以,当我提取时,文件在当前目录中提取,我不需要以后移动提取的文件,并保留子目录结构。
关于tar和备份在web上的其他地方已经有很多关于tar和备份的问题了,但是大多数的问题是要求删除整个子目录结构(拼合),或者只是添加或者删除最初的/不知道在提取时它究竟发生了什么变化),但没有更多。
阅读了一些在这里和那里find的解决scheme以及手册后,我试着:
tar -cjf site1.bz2 -C . /var/www/site1/ tar -cjf site1.bz2 -C / /var/www/site1/ tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/ tar -cjf site1.bz2 --strip-components=3 /var/www/site1/
但是他们没有一个按我想要的方式工作。 有些什么都不做,其他一些不再存档子目录。
它在Cron启动的备份shell脚本中,所以我不太清楚,哪个用户运行它,path和当前目录是什么,因此总是需要写绝对path,而不是更改当前目录以避免在脚本中进一步突破(因为它不仅备份网站,而且数据库,然后发送到FTP等)
如何做到这一点?
我只是误解了选项-C如何工作?
tar -cjf site1.tar.bz2 -C /var/www/site1 .
在上面的例子中,在做它的事情之前,tar会变成目录/var/www/site1
,因为选项-C /var/www/site1
被给出了。
从man tar
:
OTHER OPTIONS -C, --directory DIR change to directory DIR
选项-C
工作; 只是为了澄清我会张贴2个例子:
-
没有完整的path创build一个tarball:完整path
/home/testuser/workspace/project/application.war
和我们想要的只是project/application.war
所以:tar -cvf output_filename.tar -C /home/testuser/workspace project
注意:
workspace
和project
之间有一个空格。 tar会replace完整的path,只是project
。 -
通过改变目标path提取tarball(默认为
.
,即当前目录)tar -xvf output_filename.tar -C /home/deploy/
tar
将根据给定的path提取压缩包并保存创buildpath; 在我们的例子中,文件application.war
将被提取到/home/deploy/project/application.war
。/home/deploy
:在解压缩文件中给出
project
:在创buildtarball的时候给出的
注意:如果您想将创build的tarball放在目标目录中,只需在tarball名称之前添加目标path即可。 例如:
tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project
以下命令将创build一个根目录“。”。 并将指定目录中的所有文件放入其中。
tar -cjf site1.tar.bz2 -C /var/www/site1 .
如果你想把所有的文件放在tar文件的根目录下,@chinthaka是正确的。 只要进入目录,然后执行:
tar -cjf target_path/file.tar.gz *
这将把cwd中的所有文件作为根文件放到tar文件中。
似乎很多人误解了tar中的-C
选项。
tar target_path/file.tar.gz -C source_path/source_dir .
要么
tar target_path/file.tar.gz -C source_path/source_dir
不会删除生成的tar.gz文件中的绝对path前缀。
最简单的解决方法是cd
到source_path(source_dir的父目录)并运行
tar target_path/file.tar.gz source_dir
在你的脚本。 这将删除生成的tar.gz文件的目录结构中的绝对path前缀。