이 tgz를 추출하면 왜 Mac에서는 오류가 발생하지만 Linux에서는 그렇지 않습니까?


27

다소 이상한 문제가 발생하여 무슨 일이 일어나고 있는지 알 수 없습니다. 압축을 풀 때 오류가 발생 하는 tgz 파일 scip-3.2.0.tgz 가 있습니다. 오류는 OS X에서만 발생합니다 (10.10.4입니다). CentOS 6.6을 실행하는 Linux 상자에서 오류없이 파일을 추출 할 수 있습니다. 명령 행 tar명령을 사용하거나 아카이브 유틸리티를 사용할 때 오류가 발생 합니다. SCIP 메일 링리스트에 이메일을 보냈는데 다른 사용자 ( e085a4a3591eddf945dcb365d97d2512c267e374) 와 동일한 SHA-1 해시를 가지고 있으므로 다운로드 오류가 없습니다. 그들은 무슨 일이 일어나고 있는지 확실하지 않습니다.

아카이브 유틸리티를 사용하여 압축을 풀려고 할 때 발생하는 오류는 다음과 같습니다.

아카이브 유틸리티 오류

이미지가 깨진 경우 이미지의 텍스트에 다음과 같이 표시됩니다.

"scip-3.2.0.tgz"를 "Desktop"으로 확장 할 수 없습니다.
(오류 1-작업이 허용되지 않습니다.)

그리고 명령 줄을 통해 압축을 풀려고하면 이것이 출력 됩니다. tar: Error exit delayed from previous errors.저와 관련된 마지막 줄 ( )입니다. 원인을 알 수 없습니다. 아카이브 문제없이 추출 된 것처럼 보이지만 오류가 발생하여 신뢰할 수 없습니다.

누구 든지이 원인을 알고 있습니까?

[편집]
출력을 좀 더 자세히 살펴보면 1108 행에 오류가 있습니다.

x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'

2
보관 취소와 같은 다른 앱에서 작동합니까? wakaba.c3.cx/s/apps/unarchiver.html
TryTryAgain

예, 그렇습니다! 나는 그들이 다르게 무엇을하고 있는지 궁금합니다. 문제의 일부는 많은 것들을 자동화하는 bash 스크립트가 있으며, 그 안에 필요한 것을 만들 수 있도록이 tgz를 추출하는 것입니다. tarOS X 에 포함 된 명령에 버그가 있는지 궁금합니다.
Geoff

1
아마도 버그가있을 수 있습니다. 내장 된 OS X 아카이브 유틸리티가 꽤 엉성한 것으로 나타났습니다. 필요한 파일을 zip 등으로 다시 아카이브 할 수있는 방법이 없습니까? 또한 스크립트를 작성하는 경우 스크립트에 사용할 때 gunzip -c scip-3.2.0.tgz | tar xopf -와 같이 명령 행에서 오류가 발생 합니까?
TryTryAgain

예, 그 명령은 같은 오류를 발생시킵니다. gunzip잘 작동하지만 압축되지 않은 tarball을 추출하려고하면 오류가 발생합니다.
Geoff

아, 실제로 tarball에 오류가 있음이 밝혀졌습니다! 난 미쳤어 더 자세한 답변을 작성하겠습니다. 분명히 OS X의 tar 유틸리티가 여기에 올바른 것입니다!
Geoff

답변:


32

이것은 Johnny 's answer 에서 무슨 일이 일어나고 있는지 확인하고 이것이 Linux에서는 작동하지만 Mac에서는 작동하지 않는 이유에 대한 질문에 답변해야합니다.

문제는 bsdtar대부분의 Linux 시스템 이 Mac OS X이 사용 하는 반면 Mac OS X이 사용한다는 사실에 있습니다 gnutar.

당신은 설치할 수 있습니다 gnutar사용, 브루와 Mac에서 brew install gnu-tar심볼릭 링크되는, gnutar/usr/local/bingtar.

을 설치 gnutar하면 Johnny 's answer 의 단계를 사용하여 문제를 재현 할 수 있습니다 .

$ brew install gnu-tar
==> Downloading https://homebrew.bintray.com/bottles/gnu-tar-1.28.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring gnu-tar-1.28.yosemite.bottle.2.tar.gz
==> Caveats
gnu-tar has been installed as "gtar".

If you really need to use it as "tar", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
==> Summary
🍺  /usr/local/Cellar/gnu-tar/1.28: 13 files, 1.6M
$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a # make the archive with gnutar
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz
drwxr-xr-x adamliter/staff   0 2015-07-28 22:41 test/
-rw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/a
-rw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/b
hrw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/a link to test/a
$ rm -r test
$ tar -xvf test.tar.gz # try to unpack the archive with bsdtar
x test/
x test/a
x test/b
x test/a: Can't create 'test/a'
tar: Error exit delayed from previous errors.
$ echo $?
1

따라서 복제물을 질식 gnutar시키는 방식으로 물건을 다르게 보관 bsdtar합니다. gtar -ztvf test.tar.gz두 번째 인스턴스가 test/a로 보관 된다는 사실 link to test/a은 관련성이 있습니다. Johnny가 주석에서 지적한 것처럼 gnutar복제본은 실제 파일이 아닌 하드 링크로 저장됩니다 --hard-dereference.

즉, 다음을 수행 할 수 있습니다.

$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a --hard-dereference
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz test
drwxr-xr-x adamliter/staff   0 2015-07-28 23:49 test/
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/a
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/b
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/a # note that this is no longer a link
$ rm -r test
$ tar -xvf test.tar.gz # unpack with bsdtar
x test/
x test/a
x test/b
x test/a
$ echo $?
0
$ ls test/
a b

그러나이 경우 타르볼 생성을 제어 할 수 없으므로 --hard-dereference옵션이 아닙니다. 운 좋게도 OP의 답변 에 따르면이 문제는 업스트림으로 해결 된 것으로 보입니다.

그럼에도 불구하고 미래에 다른 사람이이 문제에 부딪 히고 빠른 수정이 필요하거나 응답하지 않는 업스트림 관리자가있는 경우 해결 방법이 있습니다.

당신이 중복 된 파일이 무엇인지 확인 후에는 사용할 수 --fast-read의 옵션 bsdtar(이 옵션의 일부라는 것을 참고 bsdtar, 하지 gnutar ) :

 -q (--fast-read)
         (x and t mode only) Extract or list only the first archive entry that matches each pattern or filename operand.  Exit as soon as each specified pat-
         tern or filename has been matched.  By default, the archive is always read to the very end, since there can be multiple entries with the same name
         and, by convention, later entries overwrite earlier entries.  This option is provided as a performance optimization.

그래서 Johnny의 답변 에서 장난감 예제를 따라 만든 장난감 예제에서 중복 파일은 test/a입니다. 따라서 다음을 수행하여이 문제를 피할 수 있습니다.

# this set of commands picks up from the first set of commands
# i.e., the following assumes a tarball that was *not* made with
# the --hard-dereference option, although this will work just as well
# with one that was
$ tar -xvqf test.tar.gz test/a # unarchive the first instance of test/a
x test/a
$ tar -xvf test.tar.gz --exclude test/a # unarchive everything except test/a
x test/
x test/b
$ echo $?
0
$ ls test/
a b

또한 옵션을 사용하지 gnutar않더라도 자체적으로 생성 된 복제본으로 아카이브의 압축을 풀면 매우 기쁩니다 --hard-dereference.

$ rm -r test
$ gtar -xvf test.tar.gz
test/
test/a
test/b
test/a
$ echo $?
0
$ ls test/
a b

따라서 Mac에서는 오류가 발생하지만 Linux에서는 발생하지 않는 이유에 대한 질문에 답변합니다. (대부분의) Linux 배포판은와 함께 gnutar제공되며 tarball이 패키지로 포함 gnutar되어 있기 때문에 압축을 풀면 오류가 gnutar없지만 압축을 풀면 오류가 발생 bsdtar합니다.


더 많은 것을 읽고 참조하기 위해 bsdtar와 GNU tar의 차이점은 무엇입니까? 유닉스 SE에서.


와우, 좋은 졸음, 나는 gnutar와 bsd tar 사이에 큰 차이가 있다는 것을 몰랐습니다. 당신을 기반으로 gtar -tcvf,에서는 gnutar 대신 아카이브에 중복의 링크로 두 번째 복사본 파일을 최적화 할 수있는 "스마트"충분하다.
Johnny

문서를 검색 한 후에는 이것이 gtar의 하드 링크 처리의 부작용 인 것처럼 보입니다. 중복 파일은 실제로 파일에 대한 하드 링크라고 생각되어 실제 파일 대신 링크로 저장합니다. gtar을주는 --hard-dereference옵션이 동작을 사용하지 않습니다.
Johnny

@Johnny 실제로 이것을 알아 낸 것은 Homebrew 관리자 중 2 명이었습니다 (Misty De Meo와 Dominyk Tiller). 필자가 사용하는 일부 소프트웨어 관리자가 tarball에 중복 파일이있는 새 버전을 출시했으며 Homebrew로 새 버전을 설치하려고 할 때 문제가 발생했습니다. 어쨌든 문서를 확인해 주셔서 감사합니다! 답변에 추가하겠습니다.
Adam Liter

이것은 우수하다. 무슨 일이 일어나고 있는지에 대한 가장 철저한 설명 이므로이 답변을 표시하고 있습니다. 감사!
Geoff

7

아카이브에 중복 파일이 존재하면 기본적으로 tar가 중복을 겹쳐 쓰므로 OSX에서 파일을 유효하지 않거나 추출 할 수 없어야합니다.

OSX 타르 아카이브 (A와 원래의 목적에 역행에서 중복 파일을 수 있습니다 - 그래서, 나는 당신의 요점의 동작에 혼란 조금 해요 t의 원숭이 AR 골파 는 파일의 끝에 추가 할 수 있도록, 유틸리티 테이프 아카이브 및 아카이브를 복원하면 최신 버전의 파일이 이전 버전을 덮어 씁니다.

tar가 기존 파일에 대해 경고해야하는 것은 "-k"옵션이있는 경우에만 가능합니다.

여기에 중복 파일로 아카이브를 만든 다음 문제없이 추출했습니다. 중복 파일에 대해 경고하는 -k 옵션을 추가 할 때까지는 아니 었습니다.

Macbook> tar --version
bsdtar 2.8.3 - libarchive 2.8.3
Macbook> mkdir test
Macbook> touch test/a test/b
Macbook> tar -zcvf test.tar.gz test test/a
a test
a test/a
a test/b
a test/a
Macbook> tar -ztvf test.tar.gz
drwxr-xr-x  0 user group       0 Jul 28 10:42 test/
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
-rw-r--r--  0 user group       0 Jul 28 10:42 test/b
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
Macbook> rm -r test
Macbook> tar -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a
Macbook> echo $?
0
Macbook> rm -r test
Macbook> tar -k -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a: Already exists
tar: Error exit delayed from previous errors.
Macbook> echo $?
1

간단한 umask 문제도 범인이 아닌 것 같습니다. umask를 0777로 변경하려고 시도했지만 여전히 아카이브를 추출 할 수 있습니다.

Macbook> tar -xvf test.tar
x test/
x test/a
x test/b
x test/a
Macbook> ls -l test
ls: test: Permission denied
Macbook> sudo ls -l test
total 0
----------  1 someuser  wheel  0 Jul 28 13:48 a
----------  1 someuser  wheel  0 Jul 28 13:48 b

아카이브에 쓸 수없는 디렉토리를 의도적으로 추가하여 문제를 복제 할 수 있다고 생각했지만 작동하지 않았으므로 tar는 아카이브를 추출 할 때 디렉토리에 대한 권한을 업데이트하지 않았습니다.

Macbook> mkdir -p testdir1/test testdir2/test
Macbook> touch testdir1/test/{a,b} testdir2/test/a
Macbook> chmod -w testdir2/test
Macbook> touch testdir2/test/b
touch: testdir2/test/b: Permission denied
Macbook> find testdir* -ls  | awk '{print $3, $11}'
drwxrwx--- testdir1
drwxrwx--- testdir1/test
-rw-rw---- testdir1/test/a
-rw-rw---- testdir1/test/b
drwxrwx--- testdir2
dr-xr-x--- testdir2/test
-rw-rw---- testdir2/test/a
Macbook> cd testdir1
Macbook> tar -cvf ../test.tar test/*
a test/a
a test/b
Macbook> cd ../testdir2
Macbook> tar -rvf ../test.tar test
a test
a test/a
Macbook> cd ..
Macbook> tar -tvf ./test.tar
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
Macbook> tar -xvf test.tar
x test/a
x test/b
x test/a
x test/
x test/a
Macbook> 

또한 test / a에 대한 권한을 000으로 변경하여 아카이브에 추가 한 다음 다른 테스트 / a를 추가하려고 시도했지만 그 역시 잘 작동했습니다.

drwxrwx---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
----------  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a

따라서 실제로 문제를 일으킨 원본 아카이브를보고이 문제를 일으킨 아카이브에 무엇이있을 수 있는지 확인하고 싶습니다.

파일 이름과 디렉토리가 같은 이름을 공유하는 경우 tar는 추출하는 데 문제가 있지만 매우 명확한 오류 메시지가 나타납니다.

Macbook> tar -xvf test.tar
x test/
x test/dir1/
x test/dir1/a
x test/
x test/dir1: Can't remove already-existing dir
tar: Error exit delayed from previous errors.

(충돌이 다른 방식으로 발생했다면, 즉 파일이 먼저 왔고, 같은 이름을 가진 디렉토리가 나중에 왔습니다. tar는 파일을 제거하고 디렉토리를 만듭니다.

Macbook> tar -xvf test.tar
x test/
x test/dir1
x test/
x test/dir1/
x test/dir1/a

1
tar 아카이브에서 파일 중복이 허용되기 때문에 Gist (및 그의 자체 답변)의 동작이 완전한 답변으로 보이지 않는다는 것이 좀 더 명확 해졌습니다. 따라서 tar가 해당 사례를 처리 할 수 ​​있어야하므로 "복제 된 파일로 tar 아카이브의 압축을 풀 수 없습니다"에 대한 대답은 "중복 파일 제거"가되어서는 안됩니다.
Johnny

2
이것은 실제로 의견입니다. 솔루션을 제공하지 않으며 기존 솔루션에 대해서만 논의됩니다. 조니, 댓글로 옮길 수 있습니까? 나중에 다시 와서 삭제하겠습니다. 먼저 이동할 수있는 기회를주고 싶었습니다. 감사.
Ian C.

2
@Johnny,이 정보 매우 귀중한 정보를 가지고 있지만 질문에 대한 답은 아닙니다. 다른 답변에 대한 의견입니다. Geoff의 답변이 삭제 된 경우이 답변이 도움이 되겠습니까? 아뇨. 실제로이 답변의 내용은 "Geoff의 다른 답변이 올바르지 않은 것"입니다. 원래 질문은 "이 오류의 원인은 무엇입니까?"였습니다. "원인이 무엇인지 모르지만 중복 파일이 아닙니다"라는 대답에 가장 근접 할 수는 있지만 편집이 필요하고 여전히 원래 질문에 대답하지는 않습니다.
DW

2
더 큰 그림은 배우기 좋은 곳이므로이 게시물의 세부 정보는 IMO가 뛰어 나기 때문에 오히려 삭제되지 않을 것입니다. +1 및 삭제 필요 없음-비슷한 상황에있는 다른 사람들이 OP의 손상된 파일이 없거나 손상된 상호 작용이 다른 경우 알아낼 수 있다고 생각합니다.
bmike

2
@ bmike와 다른 사람들 : 나는 왜 여기서 일어나고 있는지를 설명 해야하는 대답 을 추가 했습니다 .
Adam Liter

6

OS X tar 유틸리티가 올바른 것으로 나타났습니다! 아카이브에 실제로 오류가있었습니다. 이 이메일 스레드 가 자세히 설명하지만 문제는 아카이브에 중복 파일 이 있다는 것입니다 . SCIP 녀석은 내가 이것을 입력하면서 아카이브를 수정하고 있습니다.

[편집]
새로 업데이트 된 scip-3.2.0.tgz는 이제 잘 추출됩니다! 새로운 tgz의 SHA-1 해시는 5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476입니다.

[편집 2]
아카이브에 오류가있는 것은 아닙니다. 그것은 단순히이다 bsdtarOS X과 함께 제공, 핸들과 다르게 파일을 복제하는 gnutar리눅스하는 선박. @ 아담 리터의 대답은 여기에 무슨 일이 일어나고 있는지에 대한 철저한 설명을 제공합니다.


1
흥미 롭군 다른 유틸리티가 중복 파일 오류를 무시하고 불평하지 않고 계속 진행하고 있었습니까? 어쨌든 원인과 답을 찾게되어 기쁘다.
TryTryAgain

1
네, 다른 유틸리티가하는 일이라고 생각합니다. OS X tar 유틸리티가 여기에 맞는 것이라고 주장합니다. 잘못된 형식의 아카이브는 사용자에게 무언가가 꺼져 있음을 알리기 위해 항상 경고를 발생시켜야합니다. 당신의 도움을 주셔서 감사합니다!
Geoff

tar 아카이브의 중복 파일은 파일을 잘못된 아카이브로 만들지 않으며 tar 형식은 특히 속임수를 허용합니다. -k옵션을 지정하지 않아도 Mac tar가 아카이브 압축 풀기를 거부 한 이유가 궁금하여 기존 파일에 대해 경고합니다. 불행히도, 그들은 scip-3.2.0.tgz중복을 제거하기 위해 이미 파일을 업데이트 했으므로 해당 아카이브를 테스트 할 수 없습니다.
Johnny

에 따라 두 번 tar추출하려고하면 추출이 다르게 반응 scip-3.2.0/applications/Coloring/Makefile합니다 umask. 첫 번째로 작성된 문서가 쓰기 액세스 권한을 남기지 않으면 두 번째 시도는 실패합니다.
dan

1
@DW 나는 이것이 모순이 아닌 이유를 설명 하는 답변 을 추가 했습니다 .
Adam Liter

1

Mac OSX에 사용하는 대안의 무료 경량 아카이브 소프트웨어가 있습니다. 그것은 Keka 라고 불리며 7zip을 가장 구체적으로 풀기 위해 사용합니다. 또한 .rar, .tar, .gz 등과 같은 다른 유형의 압축을 풀 수 있습니다. OP의 특정 tar 파일에서도 작동했지만 @Geoff가 팀이 파일 복구 작업을 언급 한 후에 시도했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.