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
    • 最新
    • 标签
主页 / unix / 问题 / 492308
Accepted
StoneThrow
StoneThrow
Asked: 2019-01-04 10:57:10 +0800 CST2019-01-04 10:57:10 +0800 CST 2019-01-04 10:57:10 +0800 CST

使用标准输入中的文件列表调用 tar 的便携式方法

  • 772

我想从目录的内容创建一个 .tgz 。我还想./从 tar'ed 内容中删除前导 " "。
我这样做如下:

cd /path/to/files/ && find . -type f | cut -c 3- | xargs czf /path/to/tgz/myTgz.tgz

我最近了解到 usingxargs可能不是解决此问题的最佳方法,因为如果 cmdline arg 列表太长,xargs可能会调用tar多次,并且建议我使用tar' 从标准输入读取输入文件列表的能力。我最终找到了这篇关于如何做到这一点的文章。但是,我发现建议...

cd /path/to/files/ && find . -type f | cut -c 3- | tar czf foo.tgz -T -

...似乎不便携。它在我的开发 PC 上运行良好,但在 busybox 目标上,运行相同的命令时出现以下错误:

tar: can't open '-': No such file or directory

所以,我的问题:是否有一种真正可移植/全局的方式来调用通过从标准输入(而不是 cmdline 参数)提供输入文件tar来创建一个?.tgz

(我无法选择安装/ /etctar等替代品。)gnutarbsdtar

(第二个问题:为什么“ -T -”参数tar表示“从”读取文件stdin?从tar手册页中,我只能找到“ -T”的意思:

获取名称以从 FILE 中提取或创建

...但我看不到任何对普通“ -”的引用)

tar io-redirection
  • 3 3 个回答
  • 5682 Views

3 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2019-01-04T12:26:55+08:002019-01-04T12:26:55+08:00

    通常的约定-是在需要输入文件名的地方解释为标准输入,在需要输出文件名的地方解释为标准输出。因为这是一个通用约定,所以 GNU tar 手册页中的简短帮助摘要没有提及它,但完整的手册(通常通过 本地提供info tar)会提及。POSIX 命令行实用程序语法指南包含此约定,因此它非常普遍(但它始终是程序作者的选择)。

    BusyBox 实用程序确实遵循此约定。但是该手册没有提到tar支持该选项-T,我发布的机器上的版本也没有提到(Ubuntu 上的 1.27.2)。我不知道您为什么会收到错误“:没有这样的文件或目录”而不是“无效的选项 - 'T'”。您似乎将其tar解释-T为不带参数的选项,然后将-其视为文件名。由于在这种情况下 tar 需要一个文件名来放入存档,而不仅仅是来自文件的一些内容-,因此对.

    BusyBox 实用程序在设计上支持一组受限的功能,因为它们适用于 GNU 实用程序的更高级功能不适合的嵌入式系统。显然-T不是 BusyBox 设计者认为有用的功能。

    我认为 BusyBox tar 没有任何方法可以从标准输入读取文件名。如果您需要归档目录中的文件子集并且不需要归档中的任何符号链接,则一种解决方法是在临时目录中创建符号链接林并将此临时目录归档。

    目前尚不清楚您使用find. 如果您只想要当前目录中的文件,为什么不tar czf /path/to/archive.tgz -- *呢?如果存在子目录并且您想要归档这些子目录中的文件,而不是目录本身,则您的命令确实有意义(可能是要将它们恢复到目录结构必须存在但可能具有不同权限的地方)。在这种情况下,领先./不会造成任何伤害。

    • 7
  2. Luciano Andress Martini
    2019-01-04T11:56:45+08:002019-01-04T11:56:45+08:00

    我知道这是一个愚蠢的答案,也许对你不利,但如果你只是......

    cd /path/to/files/ && find . -type f | cut -c 3- >/tmp/temp.txt 
    tar czf foo.tgz -T /tmp/temp.txt
    
    • 6
  3. Larry
    2019-01-04T12:02:42+08:002019-01-04T12:02:42+08:00

    您可以将该-u/--update选项与 结合使用xargs。我只是尝试并证明它有效,我使用以下方法将文件名参数tar一一提供xargs -n 1:

    find top_of_tree/ -type f | xargs -n 1 tar -uf archive.tar

    当然,这只是一个概念证明。xargs在您的情况下,允许将参数列表分成不超过参数长度限制的较大部分可能更实际,以避免大量调用tar:

    find top_of_tree/ -type f | xargs tar -uf archive.tar

    先决条件是您平台上的所有实现都tar至少支持其中一个-u/--update标志。

    编辑:-u/--update标志允许tar创建以及附加到档案。

    我刚刚注意到,不幸的是,您无法更新压缩档案(tgz,使用-c标志创建)。但是,您可以先创建一个非压缩存档,然后再压缩结果。

    此外,不要让您感到困惑,因为我正在使用tar带有连字符('-' 字符)的标志。它接受这两种形式。在我的示例中,-uf将等同uf于您的示例。

    至于-选项,它可能没有记录在手册页中,tar因为它是处理流和命名文件的命令行工具的一个非常常见的 Unix 约定。 -通常是过滤器的特殊参数,并将标准输入流命名为文件。

    • 3

相关问题

  • 此 curl/tar 示例中裸破折号的含义

  • tar 目录只发送修改过的文件块

  • 如何将 airodump-ng 的输出保存到文件中?

  • 在 Solaris 上;查找、附加到 tar 球并压缩问题

  • bsdtar:如何避免覆盖现有文件信息?

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve