我正在寻找的是一种通过 STDIN 传递任意数据的方法,并让它像普通文件一样被压缩。
我试过这个
$ echo test | tar -cf test.tar /dev/stdin
这给了我一个test.tar
包含内容的文件dev/stdin
。该stdin
文件是指向/proc/self/fd/0
.
相反,我想要dev/stdin
的是 TAR 文件内部是一个带有文本的常规文件test
。类似的事情发生在:
$ tar -cf test.tar <(echo test)
但名称不同。
这是可行的吗?
我不认为你可以在这里做你想做的事。您的方法的问题在于
tar
处理文件和目录树,而您没有向它提供以下命令:即使您尝试使用以下子外壳将字符串“包装”在临时文件中:
您可以看到您的内容仍在使用这些临时文件描述符进行 TAR 处理:
如果您只想压缩字符串,则需要将它们放入文件上下文中。所以你需要做这样的事情:
您可以在 TAR 文件中看到该文件的存在:
使用 tar 复制数据
大多数已经使用 Unix 多年的人可能会看到这种模式:
我过去一直使用它来将数据从一个位置复制到另一个位置。您也可以通过 SSH 使用它。其他方法在此 U&L Q&A 中讨论,标题为:使用 busybox 克隆根目录树。
备份 /
如果您打算备份整个硬盘,还有这种方法:
参考
如果您知道要流式传输的最终大小(以字节为单位),则可以将 tar 文件创建为流。然后是在数据流之前创建初始的 512 字节标头,并在其之后创建尾随填充。尽管它确实取决于
tar
文件的确切变体,因为有几种不同的文件格式。以下步骤可能对您有用:创建与数据流大小相同的孔文件
$ dd if=/dev/zero of=mystream bs=1 count=0 seek=$SIZE
请注意,
mystream
现在是一个“空洞”文件,尽管它看起来与数据流具有相同的大小 $SIZE,但它实际上并不占用磁盘空间。用于
tar
为mystream
具有该大小的文件创建标题$ tar cf - mystream | head -c 512 > header
请注意,
tar
将要创建一个没有漏洞的文件,因此丢弃除前 512 个字节之外的所有内容非常重要。然后删除孔文件,以免被意外复制。$ rm mystream
创建一个填充拖车以填充 512 个块。
$ head -c $((echo "scale=0; 512 - $SIZE % 512" | bc )) > trailer
制作带有标题和拖尾的 $STREAM(大小为 $SIZE)的 tar 流
$ cat header $STREAM trailer
请注意,您可能希望将其流式传输到标准输出以外的其他内容。
使用
zsh
,您可以使用=(...)
使用临时文件而不是管道的进程替换形式。使用 GNUtar
的--transform
选项,您可以更改存档成员的名称:将创建一个
file.tar.gz
具有test-file
权限 0600 和 content 的成员test\n
。使用
bash
(或zsh
),您可以执行以下操作:Here-strings 也在这些 shell 中使用临时文件。但是请注意,命令替换会删除每个尾随换行符并添加一个回和 in
bash
将删除 NUL 字节。