Linux / OS X tar 비 호환성 – OS X에서 생성 된 tarball은 Linux에서 tar 해제시 오류를 발생시킵니다


106

Macbook에서 파일을 압축 해제하고 Linux에서 압축을 풀면 반복적으로 다음과 같은 경고 / 오류가 발생합니다.


 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Error exit delayed from previous errors

다행히도 이것은 아카이브에 저장된 파일에는 영향을 미치지 않으며 완벽하게 복원됩니다. 그러나 여러 시나리오에서 특히 'tar'에 의해 리턴 된 0이 아닌 실패 코드로 인해 빌드 및 설치가 불필요하게 중지되는 빌드 프로세스를 처리 할 때 문제가 발생합니다.

OS X이 나머지 Linux 환경에서 잘 작동하는 tar 파일을 빌드하도록하려면 어떻게해야합니까?

또한 보너스 포인트의 경우 이러한 문제와 함께 공개적으로 배포 된 tar 파일이 있습니다. 원래 압축 방식 변경 하지 않고 Linux에서 tar 파일을 정상적으로 처리 할 수 있는 방법이 있습니까?

답변:


71

오류 메시지를 Google에서 찾았으며 BSD tar 대 GNU tar문제 처럼 보입니다 .

tarMac OS에서 GNU를 설치 하고이를 사용하여 tar.


17
Mac OS X 10.6은 기본적으로 BSD tar를 사용하지만에 gnutar와 함께 제공됩니다 /usr/bin/gnutar.

@ 네드. 고마워. 좋은 정보입니다.
Dave Dopson

15
참고 : / usr / bin / gnutar는 더 이상 Mac OS X과 함께 제공되지 않습니다 (적어도 Mavericks 기준)
foobar

sudo 포트 설치 gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
chaosless

MacPorts를 사용하는 경우 / usr / bin에서 항목을 제거하거나 심볼릭 링크를 수동으로 생성하는 대신 / opt / local / libexec / gnubin /을 PATH 맨 위에 놓을 수도 있습니다.
Lorrin

62

Mavericks 이상을 사용하는 경우 gnutar는 더 이상 기본적으로 포함되지 않습니다.

homebrew를 사용하는 경우 해결 방법은 다음을 실행하는 것입니다.

brew install gnu-tar

그런 다음 gtarLinux 호환을 위해 명령 을 사용할 수 있습니다 .


교체 할 경우 targtar, 간단하게 심볼릭 링크를 교체

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version

위의 명령을 실행하지만 대체, 맥 OS X와 함께 제공되는 원래의 타르를 복원하려면 which gtarwhich bsdtar

출처 :
https://github.com/jordansissel/fpm/issues/576


4
양조가 지시 한대로 더 이상 연결을 끊을 필요가 없습니다. PATH에 다음과 같이 추가하면됩니다 .bashrc.PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty

1
아니면 그냥 생성 tar링크 /usr/local/bin하여 cd /usr/local/bin ; ln -s gtar tar아마도 가장 간단한 방법 -
KARTHIK T

27

GNU tar는 기본 OSX BSD tar에 포함 된 일부 선택적 정보를 좋아하지 않습니다.

GNU tar를 사용하면 다음 옵션을 사용하여 이러한 경고를 억제 할 수 있습니다.

--warning=no-unknown-keyword

참조 : https://www.gnu.org/software/tar/manual/html_section/tar_27.html

BSD tar는이 플래그를 지원하지 않으므로 모든 플랫폼에서 동일한 압축 해제 코드를 실행해야하는 경우 다음과 같은 것을 사용할 수 있습니다.

isGnuTar=$(tar --version | grep -q 'gnu')
if [ $? -eq 0 ]
then
    echo "Detected GNU tar"
    tar --warning=no-unknown-keyword -zxf my.tar.gz
else
    tar -zxf my.tar.gz
fi

5
이것은 단일 경고를 억제하기 위해 완전히 새로운 도구를 설치하지 않기 때문에 정답입니다.
cz

10

Linux 시스템에서 오류없이 tar 파일을 올바르게 추출하려면 bsdtar를 사용할 수 있습니다.

sudo apt-get install bsdtar

그런 다음 정상적으로 사용하십시오.

bsdtar -xvf file.tarfile.tar추출하려는 tar 파일은 어디에 있습니까 ?

출처 : https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

또는 그놈 파일 롤러를 사용할 수도 있습니다.


6
COPYFILE_DISABLE=1 tar cf filename.tar

또는

tar --disable-copyfile cf filename.tar

이것은 내가 개인적으로 알고있는 OS X에서 tar의 가장 눈에 띄지 않는 기능입니다.

OS X의 tarball에서 ._foo와 같은 파일을 얻는 이유무엇입니까?를 참조하십시오 .


편집 : 이것은 원치 않는 ._foo유형의 파일 생성을 중지 할뿐만 아니라 헤더 생성을 중지하지 않는 것처럼 보입니다 (적어도 Yosemite / 10.10에서는). 지적 해 주셔서 감사합니다. 그러나 보너스 포인트의 경우 다음과 같이 타르볼을 추출하여 정상적으로 처리 할 수 ​​있습니다.

tar xf filename.tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.*

이것은 꽤 오래된 gnu tar 1.15.1을 사용하여 작동했습니다! 또는 대신 pax를 사용할 수 있습니다.이 경우 추가 정보를 PaxHeader디렉토리에 던지지 만 적어도 오류없이 종료됩니다.

pax -rf filename.tar

슬프게도, 이것은 gnutar로 untarring 할 때 확장 헤더 키워드 경고를 멈추지 않는 것으로 보입니다.
JJC

이들 중 어느 것도 요세미티에서 작동하지 않는 것 같습니다 ( tar --version표시 bsdtar 2.8.3 - libarchive 2.8.3). 또한 cf후자의 경우 에는 대시가 필요합니다 .
tripleee

4

MacOSX는 이미 gnutar와 함께 제공됩니다. 빠르고 더러운 솔루션을 원한다면 이것을 추가하십시오.~/.bash_profile

alias tar='gnutar'

source ~/.bash_profile업데이트하기 위해 실행

또한 OSX는 GNU 및 BSD tar와 함께 제공됩니다. 따라서 tar의 참조를 bsd에서 gnu로 연결 해제 할 수도 있습니다.

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar

1
/etc/hosts? /etc/hosts호스트 / IP 매핑을위한 것입니까?
BenjiWiebe

1
@ BenjiWiebe가 말한 것. 더 이상한 비트는 / etc / hosts를 편집하는 것입니다. 나는 당신이 ~ / .bashrc에 의미 생각
데이브 Dopson

2
OS X에서는 .bashrc터미널 세션에 대해로드되지 않습니다. .bash_profile로그인 쉘은 새 터미널 창으로 시작되므로 필요합니다 . / cc @BenjiWiebe
slhck

올바른 :-) 그 당시에도 / etc / hosts에서 작업하고 있었기 때문에 키보드로 퍼졌습니다. 좋은 캐치
Du3

2

감사합니다. 이 스레드는 매우 유용했습니다. MacPorts를 사용하는 경우 다음과 같은 간단한 방법이 있습니다.

sudo port install gnutar

sudo ln -s /usr/local/opt/gnu-tar/libexec/gnubin/tar /usr/bin/gnutar

sudo ln -s /opt/local/libexec/gnubin/tar /usr/bin/gnutar

/Users/[yourname]/.profile에 다음 행을 추가하십시오.

alias tar='/opt/local/libexec/gnubin/tar'

종료하고 터미널 창을 다시 시작하십시오.


1

Mac의 내장 tar 바이너리는 CentOS가 좋아하지 않는 많은 추가 기능을 추가합니다. 이 문제를 해결하려면 다음을 수행하십시오.

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

희망이 도움이됩니다!


한 가지 방법입니다. github.com/ddopson/dotfiles 에서 GNU / BSD 문제를보다 포괄적으로 해결했습니다 . 나는 초기에 ~ / bin / coreutils를 가지고 있으며 github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar 와 같은 작은 shim이 있으며 Linux와 Mac을 기반으로 올바른 실행 파일을 선택하고 COREUTILS 환경이라면 변수가 설정되어
데이브 Dopson을

작업 tar를 이동하기 전에 사람들에게 / usr / bin / gnutar의 존재를 확인하도록 지시를 수정하고 싶을 수도 있습니다. 초보자는 Google을 사용하여이를 찾을 수 있으며 시스템을 해제하는 방법을 모릅니다.
msouth

몇 가지 이유로 아마 좋은 생각이 아닙니다. 1) 이제 Apple 패키지는 Apple 파일 속성을 처리하는 방법을 알고있는 기본 tar를 찾을 위치를 모릅니다. 2) GNU tar를 사용해야하는 경우, / usr / local / bin과 같은 검색 경로에서 적절한 위치에 배치해야합니다. 3) tar혼란스러운 소프트웨어를 피하기 위해 여전히 외국 프로그램 gnutar를 호출하는 것이 더 안전 합니다. Mac이 Mac처럼 작동 할 것으로 예상합니다. $ 0.02. -Erik
Erik Bennett

0

좋아, Google 검색을 사용했지만 상위 3 개의 링크에서 내가 의심 한 것을 확인했습니다.

  1. 타르 및 / 또는 버그
  2. 두 tar 유틸리티 간의 비 호환성 이 링크를
    참조하십시오 . 누군가 "bsdtar -xvf"사용이 효과가 있다고보고했습니다.

편집 : 당신은 Mac 시스템을 사용하고 있습니다. gnutar를 사용해야합니다. 설치하지 않은 경우 이미 설치되어 있어야합니다. 물론 자신을 검색하여 다른 링크를 볼 수도 있습니다.


0

MAC OSX에서 gnu-tar 설치

brew install gnu-tar

그런 다음 Linux 호환 tar를 작성하십시오.

gtar -c -f your_tar_file files

또는 pax 형식으로 아카이브를 만들 수 있습니다

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