当我将Macbook上的文件打包并在Linux中解压缩文件时,我反复收到以下警告/错误:档案,这是完美还原。但是,它的确会在许多情况下引起问题,尤其是在处理构建过程时,'tar'返回的非零失败代码会导致构建和安装不必要地停止。

我如何获得OS X可以构建可与Linux其余部分完美配合的tar文件吗?有什么方法可以使Linux优雅地处理tar文件而不更改其原始压缩方式?

#1 楼

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

评论


Mac OS X 10.6默认情况下使用BSD tar,但在/ usr / bin / gnutar也附带了gnutar。

–内德·迪利(Ned Deily)
2011年8月3日在22:03

@内德谢谢。这是好信息。

–戴夫·多普森
2011年8月4日,0:31

仅供参考:/ usr / bin / gnutar不再与Mac OS X一起提供(至少从Mavericks开始)

–foobar
13年11月27日在13:52

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

–混乱
2014年10月31日,0:41

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

–洛林
17年2月13日在22:57

#2 楼

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

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

brew install gnu-tar


然后可以使用命令gtar来实现Linux兼容性。
如果要用tar替换gtar,只需替换符号链接OS X,运行以上命令,但将which gtar替换为which bsdtar

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

评论


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

–布莱恩·佩蒂(Bryan Petty)
2015年6月10日下午16:13

或者只是通过cd / usr / local / bin在/ usr / local / bin中创建tar链接; ln -s gtar tar-可能是最简单的选项

– Karthik T
16-4-19在3:43



#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


评论


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

– c z
17年5月22日在12:53

#4 楼

要在Linux系统上正确提取tar文件而没有任何错误,可以使用bsdtar。

sudo apt-get install bsdtar

然后照常使用。 bsdtar -xvf file.tar是要提取的tar文件。

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

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

#5 楼

COPYFILE_DISABLE=1 tar cf filename.tar




tar --disable-copyfile cf filename.tar


这是我个人在OS X上最难发现的tar功能。 br />另请参见为什么在OS X的压缩包中会得到._foo这样的文件? ,它不会停止创建标头(至少在Yosemite / 10.10上);感谢评论者指出。但是,(为了获得加分:)您可以通过以下方式优雅地处理这样的tarball:

旧!或者,您可以改用pax,它(对我而言)会将多余的信息扔到._foo目录中,但至少退出时不会出现错误:

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


评论


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

– JJC
16-09-21在14:27

这些似乎都不适用于优胜美地(tar --version表示bsdtar 2.8.3-libarchive 2.8.3)。在后一种情况下,我也需要在cf之前加一个破折号。

–tripleee
17年1月31日,12:04



#6 楼

MacOSX已经附带了gnutar。如果需要快速而又肮脏的解决方案,请将其添加到~/.bash_profile

alias tar='gnutar'


,然后运行source ~/.bash_profile进行更新

此外,OSX随附GNU和BSD焦油。因此,您也可以将tar的引用从bsd取消链接到gnu:

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


评论


为什么在/ etc / hosts中? / etc / hosts用于主机/ IP映射,对吗?

– BenjiWiebe
13年2月21日在16:47

@BenjiWiebe说了什么。偶数位是编辑/ etc / hosts。我想你的意思是〜/ .bashrc

–戴夫·多普森
13年2月21日在17:57

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

–slhck
13年2月21日在19:32



正确:-)当时我也在/ etc / hosts中工作,因此它涌入了键盘。接得好

– Du3
13年2月25日在9:52

#7 楼

谢谢。这个线程非常有用。如果您使用的是MacPorts,请使用以下快速操作方法:到/ Users / [您的名字] /。profile

sudo port install gnutar

退出并重新启动终端窗口。

#8 楼

是的,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环境选择正确的可执行文件设置变量

–戴夫·多普森
13年2月8日在2:24

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

–msouth
2014年5月15日15:18

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

–埃里克·贝内特(Erik Bennett)
17年9月12日在14:42

#9 楼

好的,我使用Google搜索,但是前三个链接证实了我怀疑您的tar错误和/或
两个tar实用程序之间的不兼容性。请参阅此链接。有人报告说“使用“ bsdtar -xvf”有效。

编辑:您在Mac系统上,我想是相反的方法。您将需要使用gnutar,如果尚未安装,则应已安装。当然,您可以通过搜索自己查看其他链接。

#10 楼

在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