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

Dav*_*son 113 linux command-line tar macos

当我在 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
Run Code Online (Sandbox Code Playgroud)

幸运的是,这不会影响存档中存储的文件,这些文件已完美还原。但是,它确实会在许多情况下引起问题,尤其是在处理由 'tar' 返回的非零故障代码导致构建和安装不必要地停止的构建过程时。

如何让 OS X 构建与 Linux 世界其他部分兼容的 tar 文件?

此外,对于奖励积分,存在包含这些问题的公开分发的 tar 文件。有没有办法让 Linux 优雅地处理 tar 文件而不改变它最初的压缩方式?

hol*_*eek 74

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

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

  • 仅供参考:/usr/bin/gnutar 不再随 Mac OS X 一起提供(至少从 Mavericks 开始) (19认同)
  • Mac OS X 10.6 默认使用 BSD tar,但在`/usr/bin/gnutar` 也附带了 gnutar。 (17认同)
  • 如果使用 Homebrew:`brew install gnu-tar` (2认同)

spu*_*der 66

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

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

brew install gnu-tar
Run Code Online (Sandbox Code Playgroud)

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


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

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不再需要取消链接,正如 brew 指示的那样,您只需将其添加到 `.bashrc`(或您的等效项)中的 PATH 中:`PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH "` (4认同)

小智 32

GNU tar 不喜欢默认的 OSX BSD tar 包含的一些可选信息。

GNU tar 将允许您使用以下选项抑制这些警告:

--warning=no-unknown-keyword
Run Code Online (Sandbox Code Playgroud)

请参阅: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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确的答案,因为它不涉及为了抑制单个警告而安装全新的工具。 (7认同)

dak*_*aka 10

要在 Linux 系统上正确提取 tar 文件而不会出现任何错误,您可以使用 bsdtar。

sudo apt-get install bsdtar

然后正常使用。

bsdtar -xvf file.tarfile.tar您要提取的 tar 文件在哪里。

来源: https : //bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

或者,您也可以使用 GNOME 文件滚轮。


Zac*_*son 6

COPYFILE_DISABLE=1 tar cf filename.tar
Run Code Online (Sandbox Code Playgroud)

或者

tar --disable-copyfile cf filename.tar
Run Code Online (Sandbox Code Playgroud)

这是我个人知道的 OS X 上 tar 最不容易发现的功能。

另请参阅为什么我在 OS X 上的 tarball 中得到像 ._foo 这样的文件?


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

tar xf filename.tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.*
Run Code Online (Sandbox Code Playgroud)

这使用 gnu tar 1.15.1 有效,它已经很旧了!或者,您可以改用 pax,它(对我而言)将额外信息扔到PaxHeader目录中,但至少退出时不会出错:

pax -rf filename.tar
Run Code Online (Sandbox Code Playgroud)