从 /dev/stdin 文件制作 tar

Daf*_*ffy 5 tar devices stdin

我正在寻找的是一种通过 STDIN 传入任意数据的方法,并将其作为普通文件进行压缩。

我试过这个

$ echo test | tar -cf test.tar /dev/stdin
Run Code Online (Sandbox Code Playgroud)

这给了我一个test.tar包含内容的文件dev/stdin。该stdin文件是一个链接/proc/self/fd/0.

我想要的是dev/stdinTAR 文件内部是一个带有文本的常规文件test。类似的事情发生在:

$ tar -cf test.tar <(echo test)
Run Code Online (Sandbox Code Playgroud)

但名称不同。

这是可行的吗?

slm*_*slm 5

我不认为你可以在这里做你想做的事。您的方法的问题在于tar处理文件和目录树,您没有为其提供如下命令:

$ echo test | tar -cf test.tar /dev/sdtin
Run Code Online (Sandbox Code Playgroud)

即使您尝试使用如下子shell将字符串“包装”在临时文件中:

$ tar -cf test.tar <(echo test)
Run Code Online (Sandbox Code Playgroud)

您可以看到您的内容仍在使用这些临时文件描述符进行 TAR 处理:

$ tar tvf test.tar
lr-x------ vagrant/vagrant   0 2018-08-04 23:52 dev/fd/63 -> pipe:[102734]
Run Code Online (Sandbox Code Playgroud)

如果您只想压缩字符串,则需要将它们放入文件上下文中。所以你需要做这样的事情:

$ echo "test" > somefile && tar -cf /tmp/test.tar somefile
Run Code Online (Sandbox Code Playgroud)

您可以在 TAR 文件中看到该文件的存在:

$ tar tvf /tmp/test.tar
-rw-rw-r-- vagrant/vagrant   5 2018-08-05 00:00 somefile
Run Code Online (Sandbox Code Playgroud)

使用tar复制数据

大多数使用 Unix 多年的人可能都见过这种模式:

$ (cd /; tar cf - .)|(cd /mnt/newroot; tar pxvf -)
Run Code Online (Sandbox Code Playgroud)

我曾经一直使用它来将数据从一个位置复制到另一个位置。您也可以通过 SSH 使用它。此 U&L 问答中讨论了其他方法,标题为:使用 busybox 克隆根目录树

备份 /

如果您打算备份整个 HDD,也可以使用此方法:

$ sudo tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /
Run Code Online (Sandbox Code Playgroud)

参考