Ketidakcocokan tar Linux / OS X - tarbal yang dibuat di OS X memberikan kesalahan saat tidak di-Linux

106

Ketika saya mengumpulkan file di Macbook saya dan membukanya di Linux, saya berulang kali mendapatkan peringatan / kesalahan berikut:


 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

Untungnya, ini TIDAK mempengaruhi file yang disimpan dalam arsip, yang dipulihkan dengan sempurna. Namun, hal itu menyebabkan masalah dalam sejumlah skenario, terutama ketika berhadapan dengan proses pembangunan di mana kode kegagalan non-nol dikembalikan oleh 'tar' menyebabkan pembangunan dan pemasangan terhenti secara tidak perlu.

Bagaimana saya bisa mendapatkan OS X untuk membangun file tar yang dapat diputar dengan baik dengan seluruh dunia Linux?

Juga, untuk poin bonus, ada file tar yang didistribusikan secara publik dengan masalah ini. Apakah ada cara untuk membuat Linux menangani file tar dengan anggun tanpa mengubah cara awalnya dikompresi?

Dave Dopson
sumber

Jawaban:

71

Saya mencari Google untuk pesan kesalahan dan sepertinya masalah tar BSD vs GNU tar.

Instal GNU tarjika Anda bisa di Mac OS dan gunakan itu untuk membuat tar.

holygeek
sumber
17
Mac OS X 10.6 menggunakan tar BSD secara default tetapi juga dikirimkan dengan gnutar di /usr/bin/gnutar.
@Ned. Terima kasih. itu info bagus
Dave Dopson
15
FYI: / usr / bin / gnutar tidak dikirimkan lagi dengan Mac OS X (setidaknya pada Mavericks)
foobar
sudo port instal gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
chaosless
Jika menggunakan MacPorts, Anda juga bisa meletakkan / opt / local / libexec / gnubin / di bagian atas PATH Anda daripada menghapus apa pun dari / usr / bin atau secara manual membuat symlink.
Lorrin
62

Jika Anda menggunakan Maverick atau yang lebih baru, maka gnutar tidak lagi disertakan secara default.

Cara mengatasinya, jika Anda menggunakan homebrew, adalah menjalankan yang berikut ini:

brew install gnu-tar

Anda kemudian dapat menggunakan perintah gtaruntuk kompatibilitas linux.


Jika Anda ingin mengganti tardengan gtar, cukup ganti symlink

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version

Untuk mengembalikan tar asli yang disediakan dengan Mac Os X, jalankan perintah di atas tetapi ganti which gtardenganwhich bsdtar

Sumber:
https://github.com/jordansissel/fpm/issues/576

spuder
sumber
4
Tidak perlu memutuskan tautan lagi, seperti yang diperintahkan pembuatan bir, Anda dapat menambahkan ini ke PATH Anda di .bashrc(atau yang setara dengan Anda):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty
1
Atau cukup buat tartautan /usr/local/bindengan cd /usr/local/bin ; ln -s gtar tar- mungkin opsi paling sederhana
Karthik T
27

Tar GNU tidak menyukai beberapa informasi opsional yang disertakan oleh tar OSX BSD default.

GNU tar akan membiarkan Anda menekan peringatan itu dengan opsi:

--warning=no-unknown-keyword

Lihat: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

Perhatikan bahwa tar BSD tidak mendukung tanda itu, jadi jika Anda perlu menjalankan kode pembongkaran yang sama di semua platform, Anda dapat menggunakan sesuatu seperti:

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
Chris
sumber
5
ini harus menjadi jawaban yang tepat karena tidak melibatkan pemasangan alat yang sama sekali baru demi menekan satu peringatan.
cz
10

Untuk mengekstrak file tar dengan benar tanpa kesalahan pada sistem Linux Anda bisa menggunakan bsdtar.

sudo apt-get install bsdtar

Kemudian gunakan seperti biasa.

bsdtar -xvf file.tardi mana file.tarfile tar yang ingin Anda ekstrak.

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

Atau Anda juga dapat menggunakan rol file GNOME.

daka
sumber
6
COPYFILE_DISABLE=1 tar cf filename.tar

atau

tar --disable-copyfile cf filename.tar

Ini adalah fitur tar yang paling tidak dapat ditemukan di OS X yang secara pribadi saya sadari.

Lihat juga. Mengapa saya mendapatkan file seperti ._foo di tarball saya di OS X?


Sunting: sepertinya ini hanya akan menghentikan pembuatan ._foofile -type yang tidak diinginkan , itu tidak menghentikan pembuatan tajuk (setidaknya pada Yosemite / 10.10); terima kasih komentator untuk menunjukkannya. Namun, (untuk poin bonus :) Anda dapat dengan anggun menangani tarbal tersebut dengan mengekstraksinya seperti ini:

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

Ini bekerja menggunakan gnu tar 1.15.1, yang cukup lama! Atau, Anda dapat menggunakan pax sebagai gantinya, yang (untuk saya) membuang info tambahan ke PaxHeaderdirektori, tetapi setidaknya keluar tanpa kesalahan:

pax -rf filename.tar
Zac Thompson
sumber
Sayangnya, ini tidak muncul untuk menghentikan peringatan kata kunci header yang diperluas ketika membatalkan pengarsipan dengan gnutar.
JJC
Tak satu pun dari ini tampaknya bekerja pada Yosemite ( tar --versionmenunjukkan bsdtar 2.8.3 - libarchive 2.8.3). Juga saya perlu tanda hubung sebelumnya cfdalam kasus terakhir.
tripleee
4

MacOSX sudah hadir dengan gnutar. Jika Anda menginginkan solusi yang cepat dan kotor, tambahkan ini~/.bash_profile

alias tar='gnutar'

dan jalankan source ~/.bash_profileuntuk memperbarui

Selain itu, OSX dikirimkan dengan tar GNU dan BSD. Jadi, Anda juga dapat memutus tautan ref tar dari bsd ke gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
Du3
sumber
1
Kenapa masuk /etc/hosts? /etc/hostsuntuk pemetaan host / IP, kan?
BenjiWiebe
1
apa yang dikatakan @BenjiWiebe. Bit bahkan lebih aneh adalah mengedit / etc / hosts. Saya pikir maksud Anda ~ / .bashrc
Dave Dopson
2
Pada OS X, .bashrctidak dimuat untuk sesi Terminal. Anda perlu .bash_profile, karena shell login dimulai dengan jendela Terminal baru. / cc @BenjiWiebe
slhck
Benar :-) Saya juga bekerja di / etc / hosts pada waktu itu sehingga dimuntahkan ke keyboard. Tangkapan bagus
Du3
2

Terima kasih. Utas ini sangat berguna. Jika Anda menggunakan MacPort di sini adalah howto cepat:

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

Tambahkan baris berikut ke / Pengguna/[namaanda[/.profile

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

Keluar dan mulai ulang jendela Terminal Anda.

howdytom
sumber
1

Ya, binary bin built-in Mac menambahkan banyak hal tambahan yang tidak disukai CentOS. Untuk memperbaiki ini lakukan hal berikut:

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

Semoga itu bisa membantu!

Shaheen Ghiassy
sumber
Itu satu arah. Saya memecahkan masalah GNU / BSD lebih lengkap di github.com/ddopson/dotfiles . Saya memiliki ~ / bin / coreutils di awal jalur dan ada shims kecil di sana seperti github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar yang memilih executable yang benar berdasarkan linux vs Mac dan jika lingkungan COREUTILS variabel diatur
Dave Dopson
Anda mungkin ingin memodifikasi instruksi Anda untuk memberi tahu orang-orang untuk memeriksa keberadaan / usr / bin / gnutar sebelum memindahkan tar kerja mereka. Pemula dapat menemukan ini menggunakan google dan tidak tahu cara un-break sistem mereka.
msouth
Itu mungkin bukan ide yang bagus, karena beberapa alasan. 1) Sekarang paket Apple tidak tahu di mana menemukan tar asli, tar yang tahu cara menangani atribut file Apple. 2) Jika Anda harus menggunakan tar GNU, tempat yang tepat untuk meletakkannya di depan di jalur pencarian Anda, seperti / usr / local / bin, atau sesuatu, dan 3) Mungkin lebih aman untuk memanggil tarprogram asing gnutar untuk menghindari perangkat lunak yang membingungkan mengharapkan Mac untuk bertindak seperti Mac. $ 0,02. -Erik
Erik Bennett
0

Oke, saya menggunakan pencarian Google, tetapi tiga tautan teratas mengkonfirmasi apa yang saya duga

  1. Bug di tar Anda DAN / ATAU
  2. Ketidakcocokan antara kedua utilitas tar
    Lihat tautan ini . Di sana seseorang melaporkan bahwa "Menggunakan" bsdtar -xvf "berfungsi."

Sunting: Anda menggunakan sistem Mac, saya pikir sebaliknya. Anda harus menggunakan gnutar, itu harus sudah diinstal, jika tidak menginstalnya. Tentu saja, Anda dapat melihat tautan lain dengan mencari sendiri.

Sudhi
sumber
0

Di MAC OSX instal gnu-tar

brew install gnu-tar

kemudian buat tar kompatibel Linux Anda dengan:

gtar -c -f your_tar_file files

Atau Anda dapat membuat arsip Anda dengan format pax

tar -c --format pax -f your_tar_file files
msadek
sumber