Sto*_*row 8 tar io-redirection options busybox stdin
我想从目录的内容创建一个 .tgz。我还想./从 tar'ed 内容中去除领先的“ ”。
我这样做了如下:
cd /path/to/files/ && find . -type f | cut -c 3- | xargs czf /path/to/tgz/myTgz.tgz
Run Code Online (Sandbox Code Playgroud)
我最近了解到 usingxargs可能不是解决这个问题的最佳方法,因为如果 cmdline arg 列表太长,xargs可能会调用tar多次,我被建议利用tar's 从标准输入读取输入文件列表的能力。我最终找到了这篇关于如何做到这一点的文章。但是,我发现建议...
cd /path/to/files/ && find . -type f | cut -c 3- | tar czf foo.tgz -T -
Run Code Online (Sandbox Code Playgroud)
......似乎不便携。它在我的开发 PC 上运行良好,但在一个 busybox 目标上,运行相同的命令时出现以下错误:
tar: can't open '-': No such file or directory
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:是否有一种真正可移植/全局的方式来调用tar以.tgz通过从 stdin 提供输入文件(而不是 cmdline 参数)来创建 a ?
(我无法选择安装tar诸如gnutar/ bsdtar/etc 之类的替代品。)
(第二个问题:为什么“ -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 -- *呢?如果有子目录并且您希望将文件归档在这些子目录中,而不是目录本身(大概是将它们恢复到目录结构必须存在但可能具有不同权限的位置),则您的命令确实有意义。在这种情况下,领导./不会造成任何伤害。
我知道这是一个愚蠢的答案,可能对你不利,但如果你只是......
cd /path/to/files/ && find . -type f | cut -c 3- >/tmp/temp.txt
tar czf foo.tgz -T /tmp/temp.txt
Run Code Online (Sandbox Code Playgroud)