Linux / OS X tar 不兼容 – 在 OS X 上创建的 tarball 在 Linux 上解压时会出现错误

Linux / OS X tar 不兼容 – 在 OS X 上创建的 tarball 在 Linux 上解压时会出现错误

当我在 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 文件没有改变其原来的压缩方式?

答案1

我用 Google 搜索了错误消息,它看起来像是 BSD tar 与 GNU 的tar问题。

tar如果可以在 Mac OS 上安装 GNU (如果可以) 并使用它来创建tar

答案2

如果您使用的是 Mavericks 或更新版本,则 gnutar 不再默认包含。

如果您使用 homebrew,解决方法是执行以下操作:

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

答案3

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

答案4

COPYFILE_DISABLE=1 tar cf filename.tar

或者

tar --disable-copyfile cf filename.tar

据我所知,这是 OS X 上 tar 最难发现的功能。

也可以看看为什么我在 OS X 上的 tarball 中会得到像 ._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

相关内容