首页 文章

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

提问于
浏览
173

我在备份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的工作原理吗?

5 回答

  • 0
    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
    
  • 246

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

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

    注意: workspaceproject 之间有一个空格; tar将仅用 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
    
  • 4

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

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

    如果要将所有文件放在tar文件的根目录中,@ chinthaka是正确的 . 只需cd进入目录并执行:

    tar -cjf target_path/file.tar.gz *
    

    这会将cwd中的所有文件作为根文件放到tar文件中 .

  • 27

    似乎很多人误解了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文件中的绝对路径前缀 .

    最简单的解决方案是 cd in到source_path(source_dir的父目录)并运行

    tar target_path/file.tar.gz source_dir
    

    在你的脚本中 . 这将删除生成的tar.gz文件的目录结构中的绝对路径前缀 .

  • 4

    使用“point”可以创建名为“point”的文件夹(在Ubunta 16上) .

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

    我更详细地处理了这个并编写了一个例子 . 多行录音,加上例外 .

    tar -tf site1.bz2\
        -C /var/www/site1/ style.css\
        -C /var/www/site1/ index.html\
        -C /var/www/site1/ page2.html\
        -C /var/www/site1/ page3.html\
        --exclude=images/*.zip\
        -C /var/www/site1/ images/
        -C /var/www/site1/ subdir/
    /
    

相关问题