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

Mic*_*cha 74 linux bash design-patterns tar

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

tar -czf workspace.tar.gz *
Run Code Online (Sandbox Code Playgroud)

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

我试过了

tar -czf workspace.tar.gz .相反,但后来我得到一个错误,因为'.' 在阅读时发生了变化:

tar: ./workspace.tar.gz: file changed as we read it
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*ler 61

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

tar -czf /tmp/workspace.tar.gz .
Run Code Online (Sandbox Code Playgroud)

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

cd ..
tar -czf workspace.tar.gz workspace
Run Code Online (Sandbox Code Playgroud)

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

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base
Run Code Online (Sandbox Code Playgroud)

(这假设您没有按照符号链接到达您所在的位置,并且shell不会通过向后跳过符号链接来猜测您 - bash在这方面不值得信任.如果您不得不担心,用cd -P ..做物理变化目录愚蠢的,这不是我认为的默认行为-混乱,至少,对于那些对他们来说cd ..,从来没有任何替代的意义)


讨论中的一条评论说:

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

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

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

  1. 要么:在其他地方创建文件 - /tmp是一个可能的位置 - 然后在完成后将其移回原始位置.
  2. 或者:如果您使用的是GNU Tar,请使用该--exclude=workspace.tar.gz选项.后面的字符串=是一个模式 - 示例是最简单的模式 - 完全匹配.您可能需要指定--exclude=./workspace.tar.gz您是否在当前目录中工作而不是建议; 您可能需要指定--exclude=workspace/workspace.tar.gz是否按照建议操作一个级别.如果要排除多个tar文件,请使用' *',如--exclude=./*.gz.

  • 很好的答案,但我遇到了一种情况,我不得不在必须打包的目录中运行此命令。我没有足够的权限在外面运行它。 (2认同)

rkh*_*rov 43

如果你真的不想在tarball中包含top目录(这通常是个坏主意):

tar czf workspace.tar.gz -C /path/to/workspace .
Run Code Online (Sandbox Code Playgroud)

  • man tar:tar的第一个参数应该是一个函数; 其中一个字母是"Acdrtux",或者是一个长函数名称.**函数字母不需要以`-`**为前缀,并且可以与其他单字母选项组合使用. (10认同)
  • 仍然不起作用,我仍然有“。” 作为我的tarball中的顶级目录 (3认同)
  • 我想您在-czf中缺少-。 (2认同)

Veg*_*ger 29

有几个步骤:

  1. 更换*.包括隐藏的文件.
  2. 要在同一目录中创建存档,--exclude=workspace.tar.gz可以使用它来排除存档本身.
  3. 要在tar: .: file changed as we read it尚未创建存档时防止错误,请确保存在(例如,使用touch),因此--exclude与存档文件名匹配.(它不匹配文件不存在)

结合这导致以下脚本:

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
Run Code Online (Sandbox Code Playgroud)

  • 我阅读了所有答案和评论,这是在同一个目录中创建tarball的最好方法.从这个答案我也理解为什么会发生这种错误. (4认同)

emp*_*ing 17

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

tar -czf workspace.tar.gz . --exclude=./*.gz
Run Code Online (Sandbox Code Playgroud)

  • 但现在它抱怨文件"." 在阅读时改变了.我可以确定所有文件都已包含在内吗? (2认同)

bra*_*amp 7

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

cd ..
tar -czf workspace.tar.gz workspace
Run Code Online (Sandbox Code Playgroud)

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


caf*_*caf 6

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

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
Run Code Online (Sandbox Code Playgroud)

  • 如果正在创建文件,则不起作用. (2认同)

Pet*_*ric 5

更新:我为 OP 的评论添加了一个修复程序。

tar -czf workspace.tar.gz .
Run Code Online (Sandbox Code Playgroud)

确实会改变当前目录,但为什么不把文件放在其他地方呢?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update
Run Code Online (Sandbox Code Playgroud)


Joa*_*ner 5

还有另一种解决方案,假设文件夹中的项目数量并不大,并且假设所有名称都不包含 shell 解释为分隔符(空格)的字符:

tar -czf workspace.tar.gz `ls -A`
Run Code Online (Sandbox Code Playgroud)

ls -A打印普通文件和隐藏文件,但不打印“.”和“..” ls -a。)