Niekompatybilność ze środowiskiem Linux / OS X - paczki tar tworzone na OS X dają błędy, gdy nie są rozpakowywane w Linuksie

94

Gdy spakuję pliki na moim Macbooku i rozpakuję je w Linuksie, wielokrotnie otrzymuję następujące ostrzeżenia / błędy:


 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

Na szczęście NIE ma to wpływu na pliki przechowywane w archiwum, które są doskonale przywracane. Jednak powoduje to problemy w wielu scenariuszach, szczególnie w przypadku procesów budowania, w których niezerowy kod błędu zwrócony przez „tar” powoduje niepotrzebne zatrzymanie kompilacji i instalacji.

Jak mogę zmusić OS X do zbudowania plików tar, które dobrze grają z resztą świata Linuksa?

Ponadto w przypadku punktów bonusowych istnieje publicznie dystrybuowany plik tar z tymi problemami. Czy jest jakiś sposób na to, by Linux mógł ładnie obsługiwać plik tar bez zmieniając sposób, w jaki został pierwotnie skompresowany?

Dave Dopson
źródło

Odpowiedzi:

65

Wyszukałem komunikat o błędzie i wygląda to jak tar BSD vs. GNU tar kwestia.

Zainstaluj GNU tar jeśli możesz w Mac OS i użyj tego do utworzenia tar.

holygeek
źródło
16
Mac OS X 10.6 domyślnie używa tar BSD, ale także jest dostarczany z gnutar na /usr/bin/gnutar.
@Ned. Dzięki. to dobre informacje.
Dave Dopson
12
FYI: / usr / bin / gnutar nie jest już dostarczany z Mac OS X (przynajmniej od Mavericks)
foobar
sudo port install gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
chaosless
Jeśli używasz MacPorts, możesz także po prostu umieścić / opt / local / libexec / gnubin / na górze PATH zamiast usuwać wszystko z / usr / bin lub ręcznie tworzyć dowiązania symboliczne.
Lorrin
56

Jeśli używasz Mavericks lub nowszej wersji, gnutar nie jest już domyślnie dołączany.

Praca z homebrew polega na wykonaniu następujących czynności:

brew install gnu-tar

Następnie możesz użyć polecenia gtar dla kompatybilności z Linuksem.


Jeśli chcesz wymienić tar z gtar, po prostu zastąp dowiązanie symboliczne

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

Aby przywrócić oryginalną tar dostarczoną z Mac OS X, uruchom powyższe polecenia, ale zamień which gtar z which bsdtar

Źródło:
https://github.com/jordansissel/fpm/issues/576

spuder
źródło
2
Nie musisz już odłączać, jak nakazuje napar, możesz po prostu dodać to do swojej ścieżki w .bashrc (lub twój odpowiednik): PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty
1
Lub po prostu utwórz tar przyłączać się /usr/local/bin przez cd /usr/local/bin ; ln -s gtar tar - być może najprostsza opcja
Karthik T
24

Tar GNU nie lubi niektórych opcjonalnych informacji, które zawiera domyślna tar OSX BSD.

GNU tar pozwoli ci wyłączyć te ostrzeżenia za pomocą opcji:

--warning=no-unknown-keyword

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

Zauważ, że tar BSD nie obsługuje tej flagi, więc jeśli musisz uruchomić ten sam kod rozpakowania na wszystkich platformach, możesz użyć czegoś takiego:

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
źródło
4
powinna to być właściwa odpowiedź, ponieważ nie wymaga zainstalowania całkowicie nowego narzędzia w celu powstrzymania pojedynczego ostrzeżenia.
c z
10

Aby poprawnie wyodrębnić plik tar bez żadnych błędów w systemie Linux, możesz użyć bsdtar.

sudo apt-get install bsdtar

Następnie użyj normalnie.

bsdtar -xvf file.tar gdzie file.tar to plik tar, który chcesz wyodrębnić.

Źródło: https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

Alternatywnie możesz także użyć rolki plików GNOME.

daka
źródło
5
COPYFILE_DISABLE=1 tar cf filename.tar

lub

tar --disable-copyfile cf filename.tar

Jest to najmniej wykrywalna funkcja tar na OS X, o której osobiście wiem.

Zobacz też Dlaczego dostaję pliki takie jak ._foo do mojego tarballa na OS X?


Edycja: wygląda na to, że może to powstrzymać tworzenie niepożądanych ._foo -type plików, nie zatrzymuje tworzenia nagłówka (przynajmniej w Yosemite / 10.10); dziękuję komentatorom za wskazanie tego. Jednakże (za punkty bonusowe :) możesz z wdziękiem obsługiwać takie paczki, rozpakowując je w ten sposób:

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

To działało przy użyciu gnu tar 1.15.1, który jest dość stary! Alternatywnie możesz zamiast tego użyć pax, który (dla mnie) wyrzuca dodatkowe informacje do PaxHeader katalog, ale przynajmniej kończy się bez błędu:

pax -rf filename.tar
Zac Thompson
źródło
Niestety, nie wydaje się, aby zatrzymać ostrzeżenia o rozszerzonym nagłówku w przypadku rozpakowywania za pomocą gnutar.
JJC
Żadne z nich nie działa na Yosemite ( tar --version wskazuje bsdtar 2.8.3 - libarchive 2.8.3 ). Potrzebuję też myślnika wcześniej cf w tym drugim przypadku.
tripleee
3

MacOSX jest już wyposażony w gnutar. Jeśli chcesz szybkie i brudne rozwiązanie, dodaj to do ~/.bash_profile

alias tar='gnutar'

i biegnij source ~/.bash_profile aktualizować

Dodatkowo OSX zawiera zarówno tar GNU, jak i BSD. Możesz także odłączyć ref od tar z bsd do gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
Du3
źródło
1
Dlaczego w /etc/hosts? /etc/hosts służy do mapowania hosta / IP, prawda?
BenjiWiebe
1
co powiedział @BenjiWiebe. Równie nieprzyjemny bit to edycja / etc / hosts. Myślę, że masz na myśli ~ / .bashrc
Dave Dopson
2
W OS X, .bashrc nie jest załadowany dla sesji terminalu. Potrzebujesz .bash_profile, ponieważ powłoka logowania jest uruchamiana z nowym oknem terminalu. / cc @BenjiWiebe
slhck
Poprawnie :-) Pracowałem też w tym czasie w / etc / hosts, więc wpadł na klawiaturę. Dobry chwyt
Du3
2

Dziękuję Ci. Ten wątek był bardzo przydatny. Jeśli korzystasz z MacPorts, oto krótki poradnik:

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

Dodaj następującą linię do /Users/[yourname]/.profile

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

Zamknij i ponownie uruchom okno terminala.

howdytom
źródło
1

Tak, wbudowany binarny program Mac dodaje kilka dodatkowych rzeczy, których CentOS nie lubi. Aby to naprawić, wykonaj następujące czynności:

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

Mam nadzieję, że to pomoże!

Shaheen Ghiassy
źródło
To jeden sposób. Rozwiązałem problem GNU / BSD bardziej szczegółowo w github.com/ddopson/dotfiles . Na początku ścieżki mam ~ / bin / coreutils i tam są małe podkładki github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar które wybierają poprawny plik wykonywalny oparty na linux vs Mac i czy ustawiono zmienną środowiskową COREUTILS
Dave Dopson
Możesz zmodyfikować swoje instrukcje, aby poinformować ludzi o sprawdzeniu istnienia / usr / bin / gnutar przed przeniesieniem ich działającej tar. Nowicjusze mogą znaleźć to za pomocą Google i nie wiedzą, jak odłączyć ich system.
msouth
To prawdopodobnie nie jest dobry pomysł z kilku powodów. 1) Teraz pakiety Apple nie wiedzą, gdzie znaleźć natywną tar, tar, która wie, jak obsługiwać atrybuty plików Apple. 2) Jeśli musisz użyć GNU tar, właściwego miejsca do umieszczenia go przed ścieżką wyszukiwania, takiego jak / usr / local / bin, lub coś takiego i 3) Prawdopodobnie bezpieczniej jest nadal dzwonić tar program gnutar, aby uniknąć mylącego oprogramowania oczekującego, że Mac będzie działał jak Mac. 0,02 USD. -Erik
Erik Bennett
0

Dobra, użyłem wyszukiwarki Google, ale trzy pierwsze linki potwierdziły to, co podejrzewałem

  1. Błąd w tar i / lub OR
  2. Niezgodność między dwoma narzędziami tar
    Widzieć ten link . Ktoś donosi, że „Korzystanie z bsdtar -xvf” działało. ”

Edytować: Jesteś na systemie Mac, pomyślałem inaczej. Musisz użyć gnutar, powinien być zainstalowany, jeśli nie, zainstaluj go. Oczywiście możesz przeglądać inne linki, przeszukując siebie.

Sudhi
źródło
0

Na MAC OSX zainstaluj gnu-tar

brew install gnu-tar

następnie utwórz swoją kompatybilną z Linuksem tar z:

gtar -c -f your_tar_file files

Możesz też utworzyć swoje archiwum w formacie pax

tar -c --format pax -f your_tar_file files
msadek
źródło