현재 디렉토리의 내용을 stdout으로 tar

현재 디렉토리의 내용을 stdout으로 tar

현재 디렉터리를 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또는 /dev/stdout출력 파일로 사용:

$ tar -cf /dev/fd/1 .

하지만 이 솔루션이 보편적인지는 확실하지 않습니다.

관련 정보