我想从目录的内容创建一个 .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
等替代品。)gnutar
bsdtar
(第二个问题:为什么“ -T -
”参数tar
表示“从”读取文件stdin
?从tar
手册页中,我只能找到“ -T
”的意思:
获取名称以从 FILE 中提取或创建
...但我看不到任何对普通“ -
”的引用)
通常的约定
-
是在需要输入文件名的地方解释为标准输入,在需要输出文件名的地方解释为标准输出。因为这是一个通用约定,所以 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 -- *
呢?如果存在子目录并且您想要归档这些子目录中的文件,而不是目录本身,则您的命令确实有意义(可能是要将它们恢复到目录结构必须存在但可能具有不同权限的地方)。在这种情况下,领先./
不会造成任何伤害。我知道这是一个愚蠢的答案,也许对你不利,但如果你只是......
您可以将该
-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 约定。-
通常是过滤器的特殊参数,并将标准输入流命名为文件。