将当前目录中的内容 tar 到 stdout

将当前目录中的内容 tar 到 stdout

我正在尝试 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/1or/dev/stdout作为输出文件:

$ tar -cf /dev/fd/1 .

但是我不确定这个解决方案是否通用。

相关内容