Mam dość dziwny problem i nie mogę zrozumieć, co się dzieje. Mam plik tgz, scip-3.2.0.tgz , który zgłasza błąd podczas próby rozpakowania. Błąd występuje tylko w systemie OS X (mam 10.10.4). Mogę wyodrębnić plik bez błędu na komputerze z systemem Linux z systemem CentOS 6.6. Błąd występuje, gdy używa się zarówno wiersza tar
polecenia, jak i narzędzia do archiwizacji. Wysłałem e-mailem listę mailingową SCIP i mam taki sam skrót SHA-1 jak inny użytkownik ( e085a4a3591eddf945dcb365d97d2512c267e374
), więc nie wystąpił błąd pobierania. Nie są pewni, co się dzieje.
Oto błąd, który pojawia się podczas próby rozpakowania za pomocą narzędzia do archiwizacji:
W przypadku uszkodzenia obrazu tekst na obrazku mówi:
Nie można rozwinąć „scip-3.2.0.tgz” do „Desktop”.
(Błąd 1 - Operacja niedozwolona.)
A kiedy próbuję rozpakować za pomocą wiersza polecenia, otrzymuję dane wyjściowe . To ostatnia linia ( tar: Error exit delayed from previous errors.
), która mnie dotyczy. Nie rozumiem, co to powoduje. Archiwum wydaje się rozpakowywać bez problemu, ale nie ufam temu z powodu zgłoszenia błędu.
Czy ktoś wie, co to powoduje?
[edytuj]
Przyglądając się nieco bliżej wyjścia, wiersz 1108 zawiera błąd:
x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'
tar
poleceniu dostarczonym z OS X jest błąd.gunzip -c scip-3.2.0.tgz | tar xopf -
w wierszu poleceń, tak jak w przypadku skryptu?gunzip
działa dobrze, ale kiedy próbuję wyodrębnić nieskompresowane archiwum, wtedy pojawia się błąd.Odpowiedzi:
To powinno pomóc zidentyfikować, co się dzieje w odpowiedzi Johnny'ego , a także odpowiedzieć na pytanie, dlaczego działa to w Linuksie, ale nie na Macu.
Problem polega na tym, że używa Mac OS X
bsdtar
, podczas gdy większość systemów Linuxgnutar
.Możesz zainstalować
gnutar
na komputerze Mac z Homebrew, używającbrew install gnu-tar
, który będzie dowiązaniem symbolicznymgnutar
do/usr/local/bin
asgtar
.Jeśli zainstalujesz
gnutar
, możesz odtworzyć problem, wykonując czynności opisane w odpowiedzi Johnny'ego .Więc oczywiście
gnutar
archiwizuje rzeczy inaczej, w sposób, który powodujebsdtar
zadławienie duplikatów.gtar -ztvf test.tar.gz
Istotny jest fakt, który wskazuje, że druga instancjatest/a
jest zarchiwizowana jako alink to test/a
. Jak zauważa Johnny w komentarzach,gnutar
będą przechowywać duplikaty jako twarde linki zamiast rzeczywistego pliku, który można wyłączyć--hard-dereference
.Oznacza to, że możesz wykonać następujące czynności:
Jednak w tym przypadku oczywiście nie kontrolujesz tworzenia tarballa, więc
--hard-dereference
nie ma takiej opcji. Na szczęście, na podstawie odpowiedzi PO , wydaje się, że problem ten został rozwiązany przez upstream.Niemniej jednak, jeśli ktokolwiek inny napotka ten problem w przyszłości i potrzebuje szybkiej naprawy lub nie odpowiada na wcześniejszego opiekuna, istnieje obejście tego problemu.
Po określeniu, co to jest zduplikowany plik, możesz skorzystać z
--fast-read
opcjibsdtar
(pamiętaj, że ta opcja jest tylko częściąbsdtar
, a niegnutar
):Tak więc w przykładzie zabawki, który utworzyłem zgodnie z przykładem zabawki w odpowiedzi Johnny'ego , zduplikowany plik to
test/a
. W ten sposób można uniknąć tego problemu, wykonując następujące czynności:Należy ponadto pamiętać, że z
gnutar
przyjemnością rozpakowuje archiwum z duplikatami, które zostało utworzone przez siebie, nawet jeśli--hard-dereference
nie użyto opcji:Odpowiada to na pytanie, dlaczego błąd jest generowany na Macu, ale nie na Linuksie. (Większość) dystrybucje Linuksa są dostarczane z
gnutar
, a ponieważ tarball był prawdopodobnie spakowanygnutar
, nie będzie błędu podczas rozpakowywaniagnutar
, ale wystąpi błąd podczas rozpakowywaniabsdtar
.W celu dalszej lektury i odniesienia warto przyjrzeć się różnicom między bsdtar a GNU tar? na Unix.SE.
źródło
gtar -tcvf
, gnutar jest wystarczająco „inteligentny”, aby zoptymalizować drugi plik kopii jako łącze zamiast kopiowania go w archiwum.--hard-dereference
opcji gtar wyłącza to zachowanie.Istnienie duplikatu pliku w archiwum nie powinno powodować, że będzie on nieprawidłowy lub nie będzie można go wyodrębnić w OSX, ponieważ domyślnie tar zastępuje duplikaty.
Tak, jestem trochę zdezorientowany przez zachowanie w Twoim Gist - OSX tar pozwala na duplikatów plików w archiwum (powrotem do swojego pierwotnego celu jako t małpy ar szczypiorek użyteczności, co pozwala pliki mają być dołączone do końca archiwum taśmowe, a po przywróceniu archiwum najnowsza wersja pliku zastąpi starsze wersje
Tylko wtedy, gdy obecna jest opcja „-k”, tar powinien ostrzegać o istniejących plikach.
Tutaj utworzyłem archiwum ze zduplikowanym plikiem, a następnie wyodrębniłem je bez problemu. Dopiero po dodaniu opcji -k ostrzegło mnie przed zduplikowanym plikiem:
Prosty problem z umaskiem również nie wydaje się być winowajcą. Próbowałem zmienić swój umask na 0777 i nadal mogę rozpakować archiwum:
Pomyślałem, że mogę zduplikować problem, celowo dodając do archiwum niezapisywalny katalog, ale to nie zadziałało, tar nie zaktualizował uprawnień do katalogu podczas rozpakowywania archiwum:
Próbowałem także zmienić uprawnienia do testu / a na 000, dołączając je do archiwum, a następnie dołączając kolejny test / a, ale ten również działał dobrze:
Naprawdę chciałbym zobaczyć oryginalne archiwum, które spowodowało problem i zobaczyć, co mogło być w tym archiwum, aby spowodować ten problem.
Jeśli nazwa pliku i katalog mają tę samą nazwę, tar ma problem z wyodrębnieniem, ale ma dość wyraźny komunikat o błędzie:
(jeśli konflikt zdarzył się na odwrót, tzn. plik pojawił się jako pierwszy, potem katalog o tej samej nazwie pojawił się później, tar po prostu go usuwa i tworzy katalog:
źródło
Okazuje się, że narzędzie tar OS X było prawidłowe! W archiwum rzeczywiście wystąpił błąd. W tym wątku e-mailowym omówiono go bardziej szczegółowo, ale problem polega na tym, że w archiwum znajduje się duplikat pliku . Chłopaki SCIP naprawiają archiwum, pisząc to.
[edytuj]
Nowa aktualizacja scip-3.2.0.tgz jest teraz w porządku. Skrót SHA-1 nowego tgz to
5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476
.[edycja 2]
To nie jest tak, że w archiwum jest błąd. Po prostu ten
bsdtar
, który jest dostarczany z OS X, obsługuje duplikaty plików inaczej niżgnutar
, który jest dostarczany z Linuksem. @Adam Liter odpowiedź tutaj zapewnia dokładne wyjaśnienie tego, co się dzieje.źródło
-k
określiłeś opcji, która ostrzegałaby przed istniejącymi plikami. Niestety zaktualizowali jużscip-3.2.0.tgz
plik, aby usunąć duplikat, więc nie mogę przetestować tego archiwum.tar
Ekstrakt różnie reagują na próby wyodrębnićscip-3.2.0/applications/Coloring/Makefile
dwa razy w zależności od Państwaumask
. Jeśli 1. utworzony plik nie pozostawia dostępu do zapisu, 2. próba się nie powiedzie.Istnieje alternatywne, bezpłatne, lekkie oprogramowanie do archiwizacji, którego używam na Mac OSX. Nazywa się Keka i używam go do rozpakowywania 7zip w szczególności. Co więcej, może rozpakować inne typy, takie jak .rar, .tar, .gz itp. Działa to również dla konkretnego pliku tar OP, ale spróbowałem go po tym, jak @Geoff wspomniał, że zespół pracuje nad naprawą pliku.
źródło