Không tương thích tar của Linux / OS X - tarball được tạo trên OS X bị lỗi khi chưa được chỉnh sửa trong Linux


106

Khi tôi mở các tệp trên Macbook của mình và gỡ chúng ra trong Linux, tôi liên tục nhận được các cảnh báo / lỗi sau:


 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

May mắn thay, điều này KHÔNG ảnh hưởng đến các tệp được lưu trữ trong kho lưu trữ, được khôi phục hoàn hảo. Tuy nhiên, nó gây ra sự cố trong một số tình huống, đặc biệt là khi xử lý các quy trình xây dựng trong đó mã lỗi không bằng 0 được trả về bởi 'tar' khiến việc xây dựng và cài đặt dừng lại không cần thiết.

Làm cách nào tôi có thể có được OS X để xây dựng các tệp tar chơi độc đáo với phần còn lại của thế giới Linux?

Ngoài ra, đối với các điểm thưởng, tồn tại một tệp tar được phân phối công khai với các vấn đề này. Có cách nào để Linux xử lý tệp tar một cách duyên dáng mà không thay đổi cách nén ban đầu không?

Câu trả lời:


71

Tôi đã thông báo lỗi và có vẻ như tarvấn đề BSD so với GNU .

Cài đặt GNU tarnếu bạn có thể trên Mac OS và sử dụng nó để tạo tar.


17
Mac OS X 10.6 sử dụng tar BSD theo mặc định nhưng cũng xuất xưởng với một gnutar tại /usr/bin/gnutar.

@Ned. Cám ơn. Đó là thông tin tốt.
Dave Dopson

15
FYI: / usr / bin / gnutar không được giao nữa với Mac OS X (ít nhất là từ Mavericks)
foobar

cổng sudo cài đặt gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
hỗn loạn

Nếu sử dụng MacPorts, bạn cũng có thể chỉ cần đặt / opt / local / libexec / gnubin / ở đầu PATH của bạn thay vì xóa bất cứ thứ gì khỏi / usr / bin hoặc tạo liên kết tượng trưng theo cách thủ công.
Lorrin

62

Nếu bạn đang sử dụng Mavericks hoặc mới hơn, thì gnutar không còn được bao gồm theo mặc định.

Công việc xung quanh, nếu bạn sử dụng homebrew, là để thực hiện như sau:

brew install gnu-tar

Sau đó, bạn có thể sử dụng lệnh gtarcho khả năng tương thích linux.


Nếu bạn muốn thay thế tarbằng gtar, chỉ cần thay thế symlink

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

Để khôi phục tar gốc được cung cấp với Mac Os X, hãy chạy các lệnh trên nhưng thay thế which gtarbằngwhich bsdtar

Nguồn:
https://github.com/jordansissel/fpm/issues/576


4
Không cần phải hủy liên kết nữa, như hướng dẫn của brew, bạn chỉ cần thêm phần này vào PATH của mình trong .bashrc(hoặc tương đương):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty

1
Hoặc chỉ cần tạo ra một tarliên kết trong /usr/local/bindo cd /usr/local/bin ; ln -s gtar tar- có thể là lựa chọn đơn giản nhất
Karthik T

27

GNU tar không giống như một số thông tin tùy chọn mà tar OSX BSD mặc định bao gồm.

GNU tar sẽ cho phép bạn loại bỏ những cảnh báo đó bằng tùy chọn:

--warning=no-unknown-keyword

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

Lưu ý rằng tar BSD không hỗ trợ cờ đó, vì vậy nếu bạn cần chạy cùng một mã giải nén trên tất cả các nền tảng, bạn có thể sử dụng một cái gì đó như:

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

5
đây sẽ là câu trả lời đúng bởi vì nó không liên quan đến việc cài đặt một công cụ hoàn toàn mới với mục đích ngăn chặn một cảnh báo duy nhất.
cz

10

Để giải nén tệp tar đúng cách mà không có bất kỳ lỗi nào trên hệ thống Linux, bạn có thể sử dụng bsdtar.

sudo apt-get install bsdtar

Sau đó sử dụng như bình thường.

bsdtar -xvf file.tarnơi file.tarlà file tar bạn muốn trích xuất.

Nguồn: https://bugs.launchpad.net/ubfox/+source/tar/+orms/129314

Ngoài ra, bạn cũng có thể sử dụng con lăn tệp Gnome.


6
COPYFILE_DISABLE=1 tar cf filename.tar

hoặc là

tar --disable-copyfile cf filename.tar

Đây là tính năng ít được khám phá nhất của tar trên OS X mà cá nhân tôi biết.

Xem thêm Tại sao tôi nhận được các tệp như ._foo trong tarball của mình trên OS X?


Chỉnh sửa: có vẻ như điều này chỉ có thể dừng việc tạo các ._footệp -type không mong muốn , nó không dừng việc tạo tiêu đề (ít nhất là trên Yosemite / 10.10); cảm ơn các bình luận đã chỉ ra nó. Tuy nhiên, (đối với các điểm thưởng :) bạn có thể xử lý các tarball như vậy một cách duyên dáng bằng cách trích xuất chúng như thế này:

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

Điều này đã làm việc bằng cách sử dụng gnu tar 1.15.1, khá cũ! Ngoài ra, bạn có thể sử dụng pax thay vào đó, (đối với tôi) sẽ ném thông tin bổ sung vào một PaxHeaderthư mục, nhưng ít nhất là thoát mà không có lỗi:

pax -rf filename.tar

Đáng buồn thay, điều này dường như không dừng lại các cảnh báo từ khóa tiêu đề mở rộng khi gỡ rối với gnutar.
JJC

Cả hai dường như không hoạt động trên Yosemite ( tar --versionchỉ ra bsdtar 2.8.3 - libarchive 2.8.3). Ngoài ra tôi cần một dấu gạch ngang trước cftrong trường hợp sau.
tripleee

4

MacOSX đi kèm với gnutar. Nếu bạn muốn một giải pháp nhanh chóng và bẩn thỉu, hãy thêm nó vào~/.bash_profile

alias tar='gnutar'

và chạy source ~/.bash_profileđể cập nhật

Ngoài ra, OSX vận chuyển với cả GNU và BSD tar. Vì vậy, bạn cũng có thể hủy liên kết giới thiệu tar từ bsd sang gnu:

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

1
Tại sao trong /etc/hosts? /etc/hostslà cho ánh xạ máy chủ / IP, phải không?
BenjiWiebe

1
những gì @BenjiWiebe nói. Bit odder thậm chí là chỉnh sửa / etc / hosts. Tôi nghĩ ý của bạn là ~ / .bashrc
Dave Dopson

2
Trên OS X, .bashrckhông được tải cho các phiên Terminal. Bạn cần .bash_profile, vì một vỏ đăng nhập được bắt đầu với một cửa sổ Terminal mới. / cc @BenjiWiebe
slhck

Đúng :-) Tôi cũng đang làm việc trong / etc / hosts tại thời điểm đó nên nó xuất hiện trên bàn phím. Bắt tốt
Du3

2

Cảm ơn bạn. Chủ đề này rất hữu ích. Nếu bạn đang sử dụng MacPorts thì đây là một cách nhanh chóng:

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

Thêm dòng sau vào /Users/[yourname[/.profile

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

Thoát khỏi và khởi động lại cửa sổ Terminal của bạn.


1

Phải, nhị phân tar tích hợp của Mac thêm một loạt các công cụ bổ sung mà CentOS không thích. Để khắc phục điều này, hãy làm như sau:

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

Mong rằng sẽ giúp!


Đó là một cách. Tôi đã giải quyết vấn đề GNU / BSD một cách toàn diện hơn trong github.com/ddopson/dotfiles . Tôi có ~ / bin / coreutils ngay từ đầu và có các miếng chêm nhỏ ở đó như github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar chọn cách thực thi chính xác dựa trên linux vs Mac và nếu môi trường COREUTILS biến được đặt
Dave Dopson

Bạn có thể muốn sửa đổi hướng dẫn của mình để yêu cầu mọi người kiểm tra sự tồn tại của / usr / bin / gnutar trước khi di chuyển tar làm việc của họ. Người mới có thể tìm thấy điều này bằng cách sử dụng google và không biết cách phá vỡ hệ thống của họ.
msouth

Đó có lẽ không phải là một ý tưởng tốt, vì một vài lý do. 1) Bây giờ các gói Apple không biết tìm tar gốc, tar biết cách xử lý các thuộc tính tệp của Apple. 2) Nếu bạn phải sử dụng GNU tar, vị trí thích hợp để đặt nó ở phía trước trong đường dẫn tìm kiếm của bạn, như / usr / local / bin, hoặc thứ gì đó, và 3) Có thể an toàn hơn khi gọi tarchương trình gnutar nước ngoài để tránh nhầm lẫn phần mềm mong đợi máy Mac hoạt động như máy Mac. 0,02 đô la. -Erik
Erik Bennett

0

Được rồi, tôi đã sử dụng tìm kiếm Google, nhưng ba liên kết hàng đầu đã xác nhận những gì tôi nghi ngờ

  1. Lỗi trong tar của bạn VÀ / HOẶC
  2. Không tương thích giữa hai tiện ích tar
    Xem liên kết này . Có ai đó báo cáo rằng "Sử dụng" bsdtar -xvf "đã hoạt động."

Chỉnh sửa: Bạn đang ở trên hệ thống Mac, tôi nghĩ cách khác. Bạn sẽ cần phải sử dụng gnutar, nó nên được cài đặt, nếu không cài đặt nó. Tất nhiên, bạn có thể xem các liên kết khác bằng cách tự tìm kiếm.


0

Trên MAC OSX cài đặt gnu-tar

brew install gnu-tar

sau đó tạo tar tương thích linux của bạn với:

gtar -c -f your_tar_file files

Hoặc bạn có thể tạo kho lưu trữ của bạn với định dạng pax

tar -c --format pax -f your_tar_file files
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.