打开一个目录,但不要在存档中存储完整的绝对路径

我在备份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/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

但是我想从存档中的目录和文件名中删除部分/var/www/site1 ,以简化提取并避免无用的常量目录结构。 永远不要知道,以防万一我在Web数据未存储在/var/www下的地方提取备份网站。

对于上面的例子,我想要:

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

所以,当我提取时,文件在当前目录中被提取,并且我不需要在之后移动提取的文件,并且保留了子目录结构。

stackoverflow和web上的其他地方,已经有很多关于tar和备份的问题,但是他们中的大多数都会要求删除整个子目录结构(拼合),或者添加或删除名称中的首字母/不知道在提取时它究竟发生了什么变化),但没有更多。

在阅读了一些在这里和那里发现的解决方案以及手册后,我试着:

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脚本中,所以我不太清楚,哪个用户运行它,路径和当前目录是什么,因此总是需要写入绝对路径,并且不希望更改当前目录以避免在脚本中进一步突破(因为它不仅备份网站,还有数据库,然后将所有内容发送到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个例子:

  • 创建一个没有完整路径的tar包:完整路径/home/testuser/workspace/project/application.war以及我们想要的只是project/application.war所以:

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

    注意: workspaceproject之间有workspace ; 只有project才能取代完整路径。

  • 通过改变目标路径提取tarball(默认为. ,即当前目录)

    tar -xvf output_filename.tar -C /home/deploy/
    

    tar会根据给定的路径提取tarball并保存创建路径; 在我们的例子中,文件application.war将被解压到/home/deploy/project/application.war

    /home/deploy :在摘录中给出
    project :在创建tarball时给出

  • 注意:如果您想将创建的tarball放在目标目录中,只需在tarball名称之前添加目标路径即可。 例如:

    tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project
    

    以下命令将创建一个根目录“。”。 并将指定目录中的所有文件放入其中。

    tar -cjf site1.tar.bz2 -C /var/www/site1 .
    

    如果你想把所有的文件放在tar文件的根目录下,@chinthaka是正确的。 只需进入目录并执行以下操作:

    tar -cjf target_path/file.tar.gz *
    

    这会将cwd中的所有文件作为根文件存放在tar文件中。

    链接地址: http://www.djcxy.com/p/47083.html

    上一篇: Tar a directory, but don't store full absolute paths in the archive

    下一篇: Exclude common subdirectories when creating a tarball