打开目录,但不要在存档中存储完整的绝对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个例子:

  1. 没有完整的path创build一个tarball:完整path/home/testuser/workspace/project/application.war和我们想要的只是project/application.war所以:

     tar -cvf output_filename.tar -C /home/testuser/workspace project 

    注意: workspaceproject之间有一个空格。 tar会replace完整的path,只是project

  2. 通过改变目标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前缀。