首页 文章

tar:添加当前目录INCLUDING .svn中的所有文件和目录,依此类推

提问于
浏览
67

我尝试tar.gz一个目录并使用

tar -czf workspace.tar.gz *

生成的tar包含子目录中的 .svn 目录但不在当前目录中(因为 * 在传递给tar之前只扩展为'visible'文件)

我试过了

tar -czf workspace.tar.gz . 而是然后我收到一个错误,因为'.'在阅读时发生了变化:

tar: ./workspace.tar.gz: file changed as we read it

是否有一个技巧,以便 * 匹配目录中的所有文件(包括点前缀)?

(在Linux SLES-11上使用bash(2.6.27.19)

15 回答

  • 4

    不要在要打包的目录中创建tar文件:

    tar -czf /tmp/workspace.tar.gz .
    

    诀窍,除了它将在解压缩时提取当前目录中的文件 . 更好:

    cd ..
    tar -czf workspace.tar.gz workspace
    

    或者,如果您不知道您所在目录的名称:

    base=$(basename $PWD)
    cd ..
    tar -czf $base.tar.gz $base
    

    (这假设你没有尝试通过向后跳过符号链接来猜测你 - 在这方面 bash 不值得信任 . 如果你不得不担心,请使用 cd -P .. 来做一个物理更改目录 . 愚蠢的是它不是我视图中的默认行为 - 至少对于那些从未有过任何替代意义的人来说是令人困惑的 . )


    讨论中的一条评论说:

    我[...]需要排除顶级目录,我需要将tar放在基目录中 .

    注释的第一部分没有多大意义 - 如果tar文件包含当前目录,则从该存档中提取文件时不会创建它,因为根据定义,当前目录已存在(除非在非常奇怪的情况下) ) .

    评论的第二部分可以通过以下两种方式之一来处理:

    • 或者:在其他地方创建文件 - /tmp 是一个可能的位置 - 然后在完成后将其移回原始位置 .

    • 或者:如果您使用的是GNU Tar,请使用 --exclude=workspace.tar.gz 选项 . = 之后的字符串是一个模式 - 示例是最简单的模式 - 完全匹配 . 如果您在当前目录中工作而不是建议,则可能需要指定 --exclude=./workspace.tar.gz ;如果您按照建议操作一个级别,则可能需要指定 --exclude=workspace/workspace.tar.gz . 如果要排除多个tar文件,请使用“ * ”,如 --exclude=./*.gz .

  • 17

    如果你真的不喜欢,那么:

    tar czf workspace.tar.gz -C /path/to/workspace .
    
  • -1

    有几个步骤:

    • * 替换为 . 以包含隐藏文件 .

    • 要在同一目录中创建存档,可以使用 --exclude=workspace.tar.gz 来排除存档本身 .

    • 为了防止在尚未创建存档时出现 tar: .: file changed as we read it 错误,请确保它存在(例如,使用 touch ),因此--exclude与存档文件名匹配 . (它不匹配文件不存在)

    结合这导致以下脚本:

    touch workspace.tar.gz
    tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
    
  • 0

    在目录中想压缩(当前目录)试试这个:

    tar -czf workspace.tar.gz . --exclude=./*.gz
    
  • 6

    您可以通过返回目录并执行以下操作来包含隐藏目录:

    cd ..
    tar -czf workspace.tar.gz workspace
    

    假设你想要gzip的目录叫做workspace .

  • 54

    您可以使用 --exclude 修复 . 表单:

    tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
    
  • 4

    Update: 我为OP的评论添加了修复程序 .

    tar -czf workspace.tar.gz .
    

    确实会更改当前目录,但为什么不将文件放在其他位置呢?

    tar -czf somewhereelse/workspace.tar.gz .
    mv somewhereelse/workspace.tar.gz . # Update
    
  • 42

    实际上问题在于压缩选项 . 诀窍是将tar结果输出到压缩器而不是使用内置选项 . 顺便提一下,这也可以为您提供更好的压缩,因为您可以设置额外的压缩选项 .

    最小焦油:

    tar --exclude=*.tar* -cf workspace.tar .
    

    管道到您选择的压缩机 . 此示例很详细,并使用xz进行最大压缩:

    tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz
    

    解决方案在Ubuntu 14.04和Windows 7上的Cygwin上进行了测试 . 这是社区维基的答案,如果发现错误,请随时编辑 .

  • 0

    一个好问题 . 在ZSH中,您可以使用globbing修饰符 (D) ,它代表"dotfiles" . 相比:

    ls $HOME/*
    

    ls $HOME/*(D)
    

    这正确地排除了特殊目录条目 ... . 在Bash中,您可以使用 .* 显式包含dotfiles:

    ls $HOME/* $HOME/.*
    

    但是那包括 ... ,所以它确实有一些方法可以在bash中制作 * 匹配的dotfiles .

  • 1
    tar -czf workspace.tar.gz .??* *
    

    指定 .??* 将包含"dot"个文件和目录点后至少2个字符 . 不利的一面是它不包括点后面有单个字符的文件/目录,如 .a ,如果有的话 .

  • 22

    如果磁盘空间不是问题,这也可能是一件非常容易的事情:

    mkdir backup
    cp -r ./* backup
    tar -zcvf backup.tar.gz ./backup
    
  • 0

    这里提供的大多数解决方案的问题是tar在每个条目的开头都包含 ./ . 因此,当通过GUI压缩器打开时,这会产生 . 目录 . 所以我最终做的是:

    ls -1A | xargs -d "\n" tar cfz my.tar.gz

    如果你当前目录中已经有 my.tar.gz ,你可能想要这样做:

    ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

    Be aware of 表示xargs有一定限制(见 xargs --show-limits ) . 因此,如果您尝试在要尝试tar的目录上创建包含大量条目(目录和文件)的包,则此解决方案将无法工作 .

  • 0

    另一个解决方案,假设文件夹中的项目数量不是很大:

    tar -czf workspace.tar.gz `ls -A`
    

    ls -A 打印正常和隐藏文件,但不打印"."和"..",如 ls -a . )

  • 0

    我自己也有类似的情况 . 我认为最好在别处创建tar,然后使用-C告诉tar压缩文件的基目录 . 例:

    tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)
    

    这样就不需要排除自己的tarfile了 . 如其他评论中所述,-A将列出隐藏文件 .

  • 6

    使用 find 可能是最简单的方法:

    find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+
    

    find . -maxdepth 1 将在当前目录中找到所有文件/目录/符号链接/ etc,并运行 -exec 指定的命令 . 命令中的 {} 表示文件列表在此处, \+ 表示该命令将以下列方式运行:

    tar zcvf workspace.tar.gz .file1 .file2 .dir3
    

    代替

    tar zcvf workspace.tar.gz .file1
    tar zcvf workspace.tar.gz .file2
    tar zcvf workspace.tar.gz .dir3
    

相关问题