tar 目录,但不要在存档中存储完整的绝对路径

新手上路,请多包涵

我在备份 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 ,以简化提取并避免无用的常量目录结构。永远不知道,以防万一我在 /var/www 下没有存储网络数据的地方提取备份网站。

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

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

因此,当我提取时,文件被提取到当前目录中,之后我不需要移动提取的文件,因此保留了子目录结构。

stackoverflow 和网络上的其他地方已经有很多关于 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 的工作原理?

原文由 QuentinC 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 676
2 个回答
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

原文由 Lars Brinkhoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

选项 -C 有效;只是为了澄清,我将发布 2 个示例:

  1. 创建没有完整路径的 tarball:完整路径 /home/testuser/workspace/project/application.war 而我们想要的只是 project/application.war 所以:
    tar -cvf output_filename.tar  -C /home/testuser/workspace project

注意: workspaceproject 之间有一个空格; tar 将用 project 替换完整路径。

  1. 通过更改目标路径提取 tarball(默认为 . ,即当前目录)
    tar -xvf output_filename.tar -C /home/deploy/

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

/home/deploy :在提取时给出

project :在创建压缩包时给出

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

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

原文由 Grizli 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题