題 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文件  改變最初壓縮的方式?


93
2017-08-03 21:47


起源




答案:


我用Google搜索了錯誤消息,它似乎是BSD tar與GNU tar 問題。

安裝GNU tar 如果你可以在Mac OS上使用它來創建 tar


65
2017-08-03 22:00



Mac OS X 10.6默認使用BSD tar,但也附帶一個gnutar /usr/bin/gnutar。
@Ned。謝謝。這是個好消息。 - Dave Dopson
僅供參考:/ usr / bin / gnutar不再隨Mac OS X發貨(至少從小牛隊出發) - foobar
sudo port install gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar - chaosless
如果使用MacPorts,您也可以將/ opt / local / libexec / gnubin /放在PATH的頂部,而不是從/ usr / bin中刪除任何內容或手動創建符號鏈接。 - Lorrin


如果您使用的是Mavericks或更新版本,則默認情況下不再包含gnutar。

如果你使用自製程序,那麼解決方法是執行以下操作:

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

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


54
2017-12-14 02:31



不需要取消鏈接,正如Brew指示的那樣,你可以將它添加到你的PATH中 .bashrc (或等同物): PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH" - Bryan Petty
或者只是創建一個 tar 鏈接 /usr/local/bin 通過 cd /usr/local/bin ; ln -s gtar tar  - 可能是最簡單的選擇 - Karthik T


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

21
2018-06-03 14:30



這應該是正確的答案,因為它不涉及為了抑制單個警告而安裝一個全新的工具。 - c z


要在Linux系統上正確提取tar文件而不出現任何錯誤,可以使用bsdtar。

sudo apt-get install bsdtar

然後正常使用。

bsdtar -xvf file.tar 哪裡 file.tar 是要提取的tar文件。

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

或者您也可以使用GNOME文件滾軸。


9
2018-05-06 17:36





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,而(對我來說)將額外的信息拋入a PaxHeader 目錄,但至少退出沒有錯誤:

pax -rf filename.tar

5
2018-03-04 20:30



遺憾的是,當使用gnutar進行解包時,這似乎不會停止擴展標頭關鍵字警告。 - JJC
這些似乎都不適用於約塞米蒂(tar --version 指示 bsdtar 2.8.3 - libarchive 2.8.3)。我之前需要衝刺 cf 在後一種情況下。 - tripleee


MacOSX已經配備了gnutar。如果你想要一個快速而骯髒的解決方案,請添加它 ~/.bash_profile

alias tar='gnutar'

並運行 source ~/.bash_profile 更新

此外,OSX同時附帶GNU和BSD tar。所以你也可以取消tar的ref從bsd到gnu的鏈接:

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

3
2018-02-21 16:25



為什麼 /etc/hosts? /etc/hosts 用於主機/ IP映射,對吧? - BenjiWiebe
什麼@BenjiWiebe說。偶數odder位正在編輯/ etc / hosts。我想你的意思是〜/ .bashrc - Dave Dopson
在OS X上, .bashrc 未加載終端會話。你需要 .bash_profile,因為登錄shell是使用新的終端窗口啟動的。 / cc @BenjiWiebe - slhck
正確:-)那時我還在/ etc / hosts工作,所以它噴到了鍵盤上。接得好 - Du3


謝謝。這個帖子非常有用。如果您使用的是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/[yourname]/.profile

alias tar='/opt/local/libexec/gnubin/tar'

退出並重新啟動終端窗口。


2
2018-01-04 15:08





是的,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

希望有所幫助!


1
2018-02-07 18:28



這是一種方式。我更全面地解決了GNU / BSD問題 github.com/ddopson/dotfiles。我在路徑的早期有〜/ bin / coreutils,那裡有小墊片 github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar 根據Linux vs Mac選擇正確的可執行文件,如果設置了COREUTILS環境變量 - Dave Dopson
您可能希望修改指令,告訴人們在移動工作tar之前檢查/ usr / bin / gnutar是否存在。新手可以使用谷歌找到這個,不知道如何打破他們的系統。 - msouth
出於幾個原因,這可能不是一個好主意。 1)現在Apple軟件包不知道在哪裡可以找到本地tar,知道如何處理Apple文件屬性的tar。 2)如果你必須使用GNU tar,那麼在你的搜索路徑中放置它的正確位置就像/ usr / local / bin或者其他東西一樣,3)它可能更安全地調用外來的 tar程序gnutar,以避免混淆軟件,期望Mac像Mac一樣。 $ 0.02。 -Erik - Erik Bennett