이것은 Johnny 's answer 에서 무슨 일이 일어나고 있는지 확인하고 이것이 Linux에서는 작동하지만 Mac에서는 작동하지 않는 이유에 대한 질문에 답변해야합니다.
문제는 bsdtar
대부분의 Linux 시스템 이 Mac OS X이 사용 하는 반면 Mac OS X이 사용한다는 사실에 있습니다 gnutar
.
당신은 설치할 수 있습니다 gnutar
사용, 브루와 Mac에서 brew install gnu-tar
심볼릭 링크되는, gnutar
로 /usr/local/bin
등 gtar
.
을 설치 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에서.