![Linux / OS X tar 不兼容 – 在 OS X 上创建的 tarball 在 Linux 上解压时会出现错误](https://linux22.com/image/1285300/Linux%20%2F%20OS%20X%20tar%20%E4%B8%8D%E5%85%BC%E5%AE%B9%20%E2%80%93%20%E5%9C%A8%20OS%20X%20%E4%B8%8A%E5%88%9B%E5%BB%BA%E7%9A%84%20tarball%20%E5%9C%A8%20Linux%20%E4%B8%8A%E8%A7%A3%E5%8E%8B%E6%97%B6%E4%BC%9A%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF.png)
当我在 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 兼容命令。
如果要替换tar
,gtar
只需替换符号链接
tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version
要恢复 Mac Os X 提供的原始 tar,请运行上述命令,但将其替换which gtar
为which bsdtar
答案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