AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1516296
Accepted
psad
psad
Asked: 2020-01-11 13:29:01 +0800 CST2020-01-11 13:29:01 +0800 CST 2020-01-11 13:29:01 +0800 CST

tar 不排除目录?

  • 772

我只是在创建 tar 存档时尝试排除几个目录。目录结构相当简单(Centos 6,tar v1.23):

/test/t1
     /t2
     /t3
     ...

每个子目录 (t1, t2, t3, ...) 都包含一些 txt 文件。没有什么不寻常的。

好吧,让我们试试这个:

tar czvf test.tar.gz test/ --exclude={"t2"}

失败,t2子目录包含在存档中。

tar czvf test.tar.gz test/ --exclude={"t2",""}

成功,t2被排除在外 - 正如预期的那样。

我试图在具有相同目录结构的笔记本电脑(Ubuntu18.04,tar v1.29)上重现相同的情况。在这里,两个命令都失败了 - 该t2目录包含在创建的存档中!

  1. 为什么提供的单个目录条目{}不起作用?
  2. 为什么不同环境下的结果不一样?

这里发生了什么?这是关于 tar 版本的吗?Linux发行版依赖?查看 tar 手册(当前,v1.32)或 tar 更改日志给了我任何答案。

linux tar
  • 1 1 个回答
  • 790 Views

1 个回答

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2020-01-11T17:49:55+08:002020-01-11T17:49:55+08:00

    让我们从头开始。

    为什么不同环境下的结果不一样?

    在某些版本中,tar --exclude=…仅计算其后的路径(例如test/)。这意味着tar … test/ --exclude=t2就像根本没有一样--exclude工作。我的 Debian 9 中的GNU tar1.29 的行为肯定是这样的。

    --exclude在路径有效后(至少在某些情况下),您在 1.23 中声明。我没有理由不相信你。事实上,我tar在 Debian 7 中达到了 GNU 1.26,它的行为就像你为 1.23 描述的那样。

    结论:放置--exclude=…在路径之前,例如test/.


    为什么一个目录条目,提供在{}不起作用?

    这不是关于tar,而是关于 shell 执行(或不执行)的 shell 和大括号扩展。并非所有贝壳都这样做。Bash 可以,Zsh 也可以。普通的 POSIX shell 没有这样的功能。

    在支持大括号扩展调用的 shell 中:

    printf '<%s> ' --exclude={"t2"}; echo
    printf '<%s> ' --exclude={"t2",""}; echo
    printf '<%s> ' --exclude={foo,bar,"baz qux"}; echo
    

    在每个输出中,里面的任何内容<>都是一个单独的参数printf。您将分别看到:

    <--exclude={t2}>
    <--exclude=t2> <--exclude=>
    <--exclude=foo> <--exclude=bar> <--exclude=baz qux>
    

    我用了<>能够确定可能有多个参数,而不是一个带空格的参数。

    您可能已经想到--exclude={foo,bar,baz}make {foo,bar,baz}gettar并且该工具将其解释为某种列表。不,shell 扩展了这个语法并在之前生成了多个单词tar。该工具将这些词作为命令行参数,将它们解释为选项,并且不知道其中涉及一些大括号;就像printf得到它的论点一样。

    现在有个怪癖:要发生大括号扩展,大括号内必须至少有一个逗号 ( ,) 或点-点 ( ..,它有不同的用途)。从 Bash 的链接手册中:

    格式正确的大括号展开必须包含不带引号的左大括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。任何格式不正确的大括号扩展都保持不变。

    我们可以称之为--exclude={"t2"}格式不正确的大括号展开。字符串保持不变,tar几乎与键入时一样获取它(几乎,因为引号被删除)。该工具将排除一个字面上名为{t2}. 如您所见,没有理由排除它t2;t2不是{t2}。

    另一方面--exclude={"t2",""}是一个格式正确的大括号展开,它展开为--exclude=t2 --exclude=. 后者不排除任何东西但tar不抱怨。前者t2根据需要排除。

    --exclude={foo,bar,baz,whatever}--exclude=由于外壳的功能,您可以一次又一次地节省打字。但最终tar会得到

    --exclude=foo --exclude=bar --exclude=baz --exclude=whatever
    

    就好像您输入了四个--exclude=语句一样。

    如果只是foo要排除,那么您不能将“列表”缩短为--exclude={foo},它应该是--exclude=foo。你发现你可以使用--exclude={foo,},但这很麻烦而且没有任何用处。请记住,这些大括号不是 所必需的tar,它们永远不会得到它。

    请注意,如果您想排除任何文件(任何类型的,包括类型目录的文件),那么您需要引用以{foo,bar,baz,whatever}防止大括号展开:

    --exclude='{foo,bar,baz,whatever}'
    
    • 0

相关问题

  • 如何让我的 Linux 机器看起来像是在运行 Windows?

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve