![将当前目录中的内容 tar 到 stdout](https://linux22.com/image/158278/%E5%B0%86%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%86%85%E5%AE%B9%20tar%20%E5%88%B0%20stdout.png)
我正在尝试 tar 当前目录并流式传输到 stdout(最终传输到 Amazon S3)...我有以下命令:
tar -cf - .
但我收到此错误:
tar:拒绝将存档内容写入终端(缺少 -f 选项?) tar:错误不可恢复:立即退出
据我所知 -f - 意味着文件是标准输出,尽管-f /dev/stdout
可能更明确。
有谁知道如何正确形成命令?
答案1
与许多程序一样,tar
检查其输出是否发送到终端设备 (tty) 并相应地修改其行为。在GNU中tar
,我们可以在以下位置找到相关代码buffer.c
:
static void
check_tty (enum access_mode mode)
{
/* Refuse to read archive from and write it to a tty. */
if (strcmp (archive_name_array[0], "-") == 0
&& isatty (mode == ACCESS_READ ? STDIN_FILENO : STDOUT_FILENO))
{
FATAL_ERROR ((0, 0,
mode == ACCESS_READ
? _("Refusing to read archive contents from terminal "
"(missing -f option?)")
: _("Refusing to write archive contents to terminal "
"(missing -f option?)")));
}
}
你会发现一旦你连接stdout到某事,它会很高兴地给它写:
$ tar -cf- .
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now
然而
$ tar -cf - . | tar -tf -
./
./001.gif
./02.gif
./1234.gif
./34.gif
答案2
免费的cat
也可以:
$ tar -cf - . | cat
答案3
另一个棘手的方法:使用/dev/fd/1
or/dev/stdout
作为输出文件:
$ tar -cf /dev/fd/1 .
但是我不确定这个解决方案是否通用。