Linux / OS X tar不兼容-在Linux上解压缩时,在OS X上创建的tarball会产生错误


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”返回的非零故障代码会导致构建和安装不必要地停止。

如何获得OS X来构建可与Linux其余部分完美配合的tar文件?

此外,对于奖励积分,存在存在这些问题的公开发行的tar文件。有什么方法可以使Linux优雅地处理tar文件而不更改其原始压缩方式?

Answers:


71

我用Google搜索错误消息,似乎是BSD tar与GNU的tar问题。

tar如果可以的话,请在Mac OS上安装GNU 并使用它来创建GNU tar


17
Mac OS X 10.6默认情况下使用BSD tar,但还附带一个gnutar /usr/bin/gnutar

@内德 谢谢。这是好信息。
戴夫·多普森

15
仅供参考:/ usr / bin / gnutar不再与Mac OS X一起发货(至少从Mavericks起)
foob​​ar 2013年

sudo端口安装gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
混乱

如果使用MacPorts,也可以将/ opt / local / libexec / gnubin /放在PATH的顶部,而不是从/ usr / bin中删除任何内容或手动创建符号链接。
Lorrin

62

如果您使用的是Mavericks或更高版本,则默认情况下不再包括gnutar。

如果使用自制软件,解决方法是执行以下操作:

brew install gnu-tar

然后,您可以使用该命令gtar来实现linux兼容性。


如果要替换targtar,只需替换符号链接

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

要恢复Mac Os X随附的原始tar,请运行上述命令,但将其替换which gtarwhich bsdtar

来源:https
//github.com/jordansissel/fpm/issues/576


4
按照brew的指示,不再需要取消链接,您可以将其添加到您的PATH中.bashrc(或您的等效项):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty 2015年

1
或者只是通过-可能是最简单的选择tar/usr/local/bincd /usr/local/bin ; ln -s gtar tar
-Karthik T 2016年

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


6
COPYFILE_DISABLE=1 tar cf filename.tar

要么

tar --disable-copyfile cf filename.tar

我个人知道,这是OS X上tar最难发现的功能。

另请参见为什么在OS X的压缩包中会得到._foo之类的文件?


编辑:看起来这可能只会停止创建不需要的._foo-type文件,但不会停止创建标头(至少在Yosemite / 10.10上);感谢评论者指出。但是,(为了获得加分:)您可以通过如下方式提取此类tarball来优雅地处理它们:

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

使用gnu tar 1.15.1可以正常工作,它已经很旧了!或者,您可以改用pax,它(对我而言)会将多余的信息扔到PaxHeader目录中,但至少退出时不会出现错误:

pax -rf filename.tar

可悲的是,当使用gnutar解压缩时,这似乎并没有停止扩展标头关键字警告。
JJC

这些似乎都不适用于优胜美地(tar --version指示bsdtar 2.8.3 - libarchive 2.8.3)。cf在后一种情况下,我也需要先破折号。
三人房

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
Dave Dopson

2
在OS X上,.bashrc不会为终端会话加载。您需要使用.bash_profile,因为登录shell是用新的Terminal窗口启动的。/ cc @BenjiWiebe
slhck

正确:-)当时我也在/ etc / hosts中工作,因此它涌入了键盘。好收获
Du3 2013年

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 / [您的名字] /。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,它们基于linux vs Mac以及COREUTILS环境选择正确的可执行文件设置了变量
Dave Dopson

您可能需要修改说明,告诉人们在移动工作tar之前检查/ usr / bin / gnutar的存在。新手可以使用Google找到它,而不知道如何破解他们的系统。
msouth 2014年

有几个原因,这可能不是一个好主意。1)现在,Apple软件包不知道在哪里可以找到本机tar,该tar知道如何处理Apple文件属性。2)如果必须使用GNU tar,则将其放置在搜索路径中的正确位置(例如/ usr / local / bin等),并且3)调用外部tar程序gnutar 可能更安全,以避免混淆软件期望Mac像Mac。0.02美元。-Erik
Erik Bennett

0

好的,我使用Google搜索,但是前三个链接证实了我的怀疑

  1. 在您的tar中进行错误和/或
  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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.