Neden bu tgz'yi çıkartmak Mac'ime bir hata veriyor ama Linux'ta değil?


27

Oldukça garip bir problem yaşıyorum ve neler olduğunu çözemiyorum. Paketi açmaya çalıştığımda bir hata fırlatan bir scg-3.2.0.tgz dosyası olan bir tgz dosyasına sahibim . Hata sadece OS X'te gerçekleşiyor (ben 10.10.4'üm). Dosyayı, CentOS 6.6 çalıştıran bir Linux kutusunda hatasız olarak çıkarabilirim. Hata hem komut satırı tarkomutunu kullanırken hem de arşivleme yardımcı programını kullanırken meydana gelir . SCIP e-posta listesini e-postayla gönderdim ve başka bir kullanıcıyla aynı SHA-1 hastasına ( e085a4a3591eddf945dcb365d97d2512c267e374) sahip oldum , bu yüzden indirme hatası yoktu. Neler olup bittiğinden emin değiller.

İşte arşiv yardımcı programını kullanarak açmayı denediğimde aldığım hata:

arşiv yardımcı programı hatası

Görüntünün bozulmaması durumunda, görüntüdeki metin şunu söyler:

"Scip-3.2.0.tgz", "Masaüstü" içine genişletilemiyor.
(Hata 1 - İşleme izin verilmiyor.)

Ve komut satırı üzerinden açmaya çalıştığımda, bu elde ettiğim çıktı . tar: Error exit delayed from previous errors.Beni ilgilendiren son satır ( ). Buna neyin sebep olduğunu anlamıyorum. Arşiv sorunsuz çıkar gibi gözüküyor , fakat o hatanın atılmasında güvenmiyorum.

Buna neyin neden olduğunu bilen var mı?

[değiştir]
Çıkışa biraz daha yakına baktığımızda, satır 1108 hata içeriyor:

x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'

2
Unarchiver gibi başka bir uygulama ile çalışır mı? wakaba.c3.cx/s/apps/unarchiver.html
TryTryAgain

Evet öyle! Ne farklı yaptıklarını merak ediyorum. Sorunun bir kısmı, bir sürü şeyi otomatikleştiren bir bash betiğine sahip olmam ve yapması gerekenlerden biri de bu tgz'yi çıkartmak ki onun içinde olanı oluşturabilmesi. tarOS X ile gelen komutta bir hata olup olmadığını merak ediyorum .
Geoff,

1
Oldukça muhtemel, bir hata var. Yerleşik OS X arşiv yardımcı programını oldukça berbat buldum. Gerekli dosyaları bir zip veya başka bir şeyde yeniden arşivlemenin bir yolu yok mu? Ayrıca, komut dosyası oluşturuyorsanız, gunzip -c scip-3.2.0.tgz | tar xopf -komut satırından komut dosyası için kullandığınız gibi hata da oluşur mu?
TryTryAgain

Evet, bu komut aynı hatayı veriyor. gunzipgayet iyi çalışıyor, ancak sıkıştırılmamış tarball'u çıkarmaya çalıştığımda, hata o zaman atılıyor.
Geoff,

Ah, tarball'da gerçekten bir hata olduğu ortaya çıktı! Ben deli değilim. Daha ayrıntılı bir cevap yazacağım. Görünüşe göre OS X'deki tar yardımcı programı burada doğru olanıydı!
Geoff,

Yanıtlar:


32

Bu, Johnny'nin cevabında neler olup bittiğini belirlemenin yanı sıra, bunun neden Linux'ta çalıştığını ama Mac'te çalışmadığı sorusunu yanıtlamalıdır.

Buradaki sorun, Mac OS X'in kullandığı bsdtarve Linux sistemlerinin çoğunun kullandığı gerçeğinde yatmaktadır gnutar.

Sen yükleyebilir gnutarkullanarak, Homebrew ile Mac üzerinde brew install gnu-tarsembolik bir link, hangi gnutariçine /usr/local/binkadar gtar.

Takarsanız gnutar, Johnny'nin cevabındaki adımları kullanarak sorunu yeniden oluşturabilirsiniz .

$ brew install gnu-tar
==> Downloading https://homebrew.bintray.com/bottles/gnu-tar-1.28.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring gnu-tar-1.28.yosemite.bottle.2.tar.gz
==> Caveats
gnu-tar has been installed as "gtar".

If you really need to use it as "tar", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
==> Summary
🍺  /usr/local/Cellar/gnu-tar/1.28: 13 files, 1.6M
$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a # make the archive with gnutar
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz
drwxr-xr-x adamliter/staff   0 2015-07-28 22:41 test/
-rw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/a
-rw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/b
hrw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/a link to test/a
$ rm -r test
$ tar -xvf test.tar.gz # try to unpack the archive with bsdtar
x test/
x test/a
x test/b
x test/a: Can't create 'test/a'
tar: Error exit delayed from previous errors.
$ echo $?
1

Bu nedenle, açıkçası gnutarişleri bsdtarkopyalarda boğulmaya neden olacak şekilde farklı şekilde arşivler . Aslında gtar -ztvf test.tar.gzikinci örneği indciates olduğu test/abir şekilde arşivlenir link to test/aalakalıdır. Johnny, yorumlarda da belirtildiği gibi, gnutarkopyaları, devre dışı bırakılabilen gerçek dosya yerine zor bağlantılar olarak kaydeder --hard-dereference.

Yani, aşağıdakileri yapabilirsiniz:

$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a --hard-dereference
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz test
drwxr-xr-x adamliter/staff   0 2015-07-28 23:49 test/
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/a
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/b
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/a # note that this is no longer a link
$ rm -r test
$ tar -xvf test.tar.gz # unpack with bsdtar
x test/
x test/a
x test/b
x test/a
$ echo $?
0
$ ls test/
a b

Ancak, bu durumda, açıkça tarball oluşturulmasını kontrol etmiyorsunuz, bu yüzden --hard-dereferencebir seçenek değil. Neyse ki, OP'nin cevabına dayanarak, bu sorunun yukarı havza tarafından çözüldüğü görülüyor.

Bununla birlikte, başkaları gelecekte bu sorunla karşılaşırsa ve hızlı bir düzeltmeye ihtiyaç duyuyorsa veya tepkisiz bir yukarı havza sağlayıcısına sahipse, bir geçici çözüm vardır.

Yinelenen dosya ne belirledikten sonra, kullanabilirsiniz --fast-readseçeneğine bsdtar(bu seçenek sadece bir parçası olduğunu not bsdtar, not gnutar ):

 -q (--fast-read)
         (x and t mode only) Extract or list only the first archive entry that matches each pattern or filename operand.  Exit as soon as each specified pat-
         tern or filename has been matched.  By default, the archive is always read to the very end, since there can be multiple entries with the same name
         and, by convention, later entries overwrite earlier entries.  This option is provided as a performance optimization.

Yani, Johnny'nin cevabındaki oyuncak örneğini izleyerek yarattığım oyuncak örneğinde , kopya dosya test/a. Böylece, aşağıdakileri yaparak bu sorunu önleyebilirsiniz:

# this set of commands picks up from the first set of commands
# i.e., the following assumes a tarball that was *not* made with
# the --hard-dereference option, although this will work just as well
# with one that was
$ tar -xvqf test.tar.gz test/a # unarchive the first instance of test/a
x test/a
$ tar -xvf test.tar.gz --exclude test/a # unarchive everything except test/a
x test/
x test/b
$ echo $?
0
$ ls test/
a b

Dahası, seçeneğin kullanılmadığı gnutarzamanlarda bile, kendi oluşturduğu kopyaları içeren bir arşivi açmaktan tamamen mutluluk duyduğuna dikkat edin --hard-dereference:

$ rm -r test
$ gtar -xvf test.tar.gz
test/
test/a
test/b
test/a
$ echo $?
0
$ ls test/
a b

Bu yüzden neden Mac’te bir hatanın atıldığına ilişkin sorunuzu yanıtlar, ancak Linux’a değil. (Çoğu) Linux dağıtımı ile dağıtır gnutarve tarball büyük olasılıkla paketlendiğinden gnutar, paketten çıkarırken hiçbir hata olmaz gnutar, ancak paketten çıkarırken bir hata olur bsdtar.


Daha fazla okuma ve referans için, bsdtar ve GNU tar arasındaki farklar nelere bakmak isteyebilir ? Unix.SE.


Vay, güzel uykular, gnutar ve bsd tar arasında önemli bir fark olduğu hakkında hiçbir fikrim yoktu. Sizin gtar -tcvftemelinize göre, gnutar, arşivde kopyalamak yerine, ikinci kopya dosyasını bir bağlantı olarak en iyi duruma getirmek için yeterince "akıllı" dır.
Johnny

Belgeleri taradıktan sonra, bu, gtarın sert bağlantı işlemesinin bir yan etkisi gibi görünüyor. Yinelenen dosyanın gerçekte dosyaya sabit bir bağlantı olduğunu düşünüyor, bu yüzden gerçek dosya yerine bir bağlantı olarak saklıyor. Gtar --hard-dereferenceseçeneğine bu seçeneği devre dışı bırakır.
Johnny

@Johnny Bunu farkeden Homebrew bakıcılarının gerçekten ikisi (Misty De Meo ve Dominyk Tiller). Kullandığım bazı yazılımların sağlayıcısı, tarball'da yinelenen bir dosyayla yeni bir sürüm yayınladı; bu, yeni sürümü Homebrew ile yüklemeye çalışırken sorunlara yol açtı (tabii ki). Neyse, dokümanları kontrol ettiğin için teşekkürler! Bunu cevaba ekleyeceğim.
Adam Litre

Bu mükemmel. Bunun cevabını işaretliyorum, çünkü olan bitenin en kapsamlı açıklaması. Teşekkürler!
Geoff,

7

Arşivdeki yinelenen bir dosyanın varlığı, varsayılan olarak, tar üzerine yinelenen kopyaların üzerine yazılacağı gibi, geçersiz kılmamalı veya OSX'te çıkartılamamalıdır.

OSX tar arşiv (a olarak orijinal amacın bir atacılıkla çift dosyaları için izin verir - Yani, sizin Gist'e davranış karıştı biraz kafam t maymun ar chive o dosyaların sonuna eklenecek verir, böylece, fayda kaset arşivi ve arşiv geri yüklendiğinde, dosyanın en yeni sürümü eski sürümlerin üzerine yazar.)

Sadece "-k" seçeneği mevcut olduğunda tar önceden varolan dosyalar hakkında uyarmalıdır.

Burada yinelenen bir dosya içeren bir arşiv oluşturdum ve daha sonra sorunsuz bir şekilde çıkarttım. -K seçeneğini ekleyene kadar, kopya dosya konusunda beni uyardı.

Macbook> tar --version
bsdtar 2.8.3 - libarchive 2.8.3
Macbook> mkdir test
Macbook> touch test/a test/b
Macbook> tar -zcvf test.tar.gz test test/a
a test
a test/a
a test/b
a test/a
Macbook> tar -ztvf test.tar.gz
drwxr-xr-x  0 user group       0 Jul 28 10:42 test/
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
-rw-r--r--  0 user group       0 Jul 28 10:42 test/b
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
Macbook> rm -r test
Macbook> tar -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a
Macbook> echo $?
0
Macbook> rm -r test
Macbook> tar -k -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a: Already exists
tar: Error exit delayed from previous errors.
Macbook> echo $?
1

Basit bir umask problemi de suçlu gibi görünmüyor, umask'ımı 0777 olarak değiştirmeyi denedim ve hala arşivi çıkartabiliyorum:

Macbook> tar -xvf test.tar
x test/
x test/a
x test/b
x test/a
Macbook> ls -l test
ls: test: Permission denied
Macbook> sudo ls -l test
total 0
----------  1 someuser  wheel  0 Jul 28 13:48 a
----------  1 someuser  wheel  0 Jul 28 13:48 b

Sorunu, kasıtlı olarak arşive istenmeyen bir dizin ekleyerek çoğaltabileceğimi düşündüm, ancak bu işe yaramadı, tar, arşivi çıkardığında dizindeki izinleri güncellemedi:

Macbook> mkdir -p testdir1/test testdir2/test
Macbook> touch testdir1/test/{a,b} testdir2/test/a
Macbook> chmod -w testdir2/test
Macbook> touch testdir2/test/b
touch: testdir2/test/b: Permission denied
Macbook> find testdir* -ls  | awk '{print $3, $11}'
drwxrwx--- testdir1
drwxrwx--- testdir1/test
-rw-rw---- testdir1/test/a
-rw-rw---- testdir1/test/b
drwxrwx--- testdir2
dr-xr-x--- testdir2/test
-rw-rw---- testdir2/test/a
Macbook> cd testdir1
Macbook> tar -cvf ../test.tar test/*
a test/a
a test/b
Macbook> cd ../testdir2
Macbook> tar -rvf ../test.tar test
a test
a test/a
Macbook> cd ..
Macbook> tar -tvf ./test.tar
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
Macbook> tar -xvf test.tar
x test/a
x test/b
x test/a
x test/
x test/a
Macbook> 

Ayrıca test / a'daki izinleri 000'a değiştirmeyi, arşive eklemeyi, ardından başka bir test / a eklemeyi denedim, ama o da iyi çalıştı:

drwxrwx---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
----------  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a

Bu yüzden soruna neden olan orijinal arşivi ve bu arşive neden olan bu soruna neden olabilecekleri görmek istiyorum.

Bir dosya adı ve dizin aynı adı paylaşıyorsa, tar ayıklanırken sorun yaşar, ancak oldukça açık bir hata iletisine sahiptir:

Macbook> tar -xvf test.tar
x test/
x test/dir1/
x test/dir1/a
x test/
x test/dir1: Can't remove already-existing dir
tar: Error exit delayed from previous errors.

(Çakışma tam tersi bir şekilde olmuşsa, yani bir dosya önce geldi, sonra aynı ada sahip bir dizin daha sonra geldi, tar sadece onu kaldırır ve dizini oluşturur:

Macbook> tar -xvf test.tar
x test/
x test/dir1
x test/
x test/dir1/
x test/dir1/a

1
Katranındaki (ve kendi cevabındaki) davranışının tam cevap olarak görünmediğini, çünkü dosya kopyalarının katranlı bir arşivde bulunmasına izin verdiğini biraz daha netleştirdim. Bu nedenle, "katran arşivi çoğaltılmış bir dosyadan açamıyorum" cevabı, tar'nın bu olayı ele alabilmesi gerektiği için "Yinelenen dosyayı kaldır" olmamalıdır.
Johnny,

2
Bu gerçekten bir yorum - bir çözüm sunmuyor, sadece mevcut bir çözümle ilgili bir tartışma. Johnny, lütfen bunu bir yoruma taşıyabilir misin? Daha sonra geri gelip bunu sileceğim, ilk önce onu hareket ettirme şansı vermek istedim. Teşekkürler.
Ian C.

2
@Johnny bu bilgiler yok süper değerli bilgiler var, ama soruya bir cevap değil. Başka bir cevapla ilgili bir yorum. Bunu şu şekilde düşünün: Geoff'in cevabı silinmişse, bu cevap faydalı olur mu? Hayır olmaz. Gerçekten, bu cevabın içeriği "Geoff'in diğer cevabı doğru görünmüyor" şeklindedir. Asıl soru "Bu hataya neden olan nedir?" İdi. Cevaplayabileceğiniz en yakın şey, "Neye neden olduğunu bilmiyorum, ancak yinelenen bir dosya değil" - ancak bu bir düzenleme gerektiriyor ve yine de asıl soruya gerçekten cevap vermiyor.
DW,

2
Büyük resim burası öğrenilecek bir yer olduğundan ve bu yazıdaki ayrıntılar IMO'nun mükemmel olması nedeniyle silinmemeyi tercih ederim. +1 ve silmeye gerek yok - benzer bir durumda başkalarının OP'nin bozuk dosyasına sahip olmadıklarında veya yolsuzluk etkileşiminin farklı olup olmadığını çözmelerine yardımcı olacağını düşünüyorum.
bmike

2
@bmike ve diğerleri: En azından burada neler olduğunu açıklayan bir cevap ekledim , yine de neden olmasa da.
Adam Litre,

6

OS X tar yardımcı programı doğru biri olduğu ortaya çıktı! Arşivde gerçekten bir hata oluştu. Bu e-posta dizisi daha ayrıntılı olarak ele alıyor, ancak sorun arşivde yinelenen bir dosya bulunması . SCIP adamları bu yazıyı yazarken arşivi tamir ediyorlar.

[değiştir]
Yeni güncellenen scip-3.2.0.tgz şimdi gayet iyi! Yeni tgz'nin SHA-1 karması 5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476.

[değiştir 2]
Arşivde bir hata olmadığı için değil. Basitçe bsdtar, OS X ile birlikte gelen, çift dosyaları gnutarLinux'la gelenlerden farklı şekilde ele alır . @Adam Liter'in cevabı burada olan bitenin tam bir açıklamasıdır.


1
İlginç. Yani belki de diğer araçlar kopya dosya hatasını görmezden geliyor ve şikayet etmeden devam ediyorlardı? Neyse, sebebini ve cevabını bulduğuna sevindim.
TryTryAgain

1
Evet, bence tam olarak diğer kuruluşların yaptığı şey bu. Ben OS X tar yardımcı programı burada doğru olanı olduğunu iddia ediyorum. Hatalı biçimlendirilmiş bir arşiv, kullanıcıyı bir şeylerin kapalı olduğu konusunda uyarmak için her zaman en az bir uyarı vermelidir. Yardımın için teşekkürler!
Geoff,

Bir tar arşivindeki yinelenen bir dosya onu hatalı biçimlendirilmiş bir arşiv yapmaz, tar formatı özellikle çiftlere izin verir. Mac tar'in neden -könceden seçenek sunmamış olsa da , önceden varolan dosyalar hakkında uyarmasını sağlayacak olan arşivi açmayı reddettiğini merak ediyorum. Ne yazık ki, scip-3.2.0.tgzdupe'yi kaldırmak için dosyayı zaten güncellediler , bu yüzden o arşivi test edemiyorum.
Johnny,

tarÖzü ayıklamak için çalışırken üzerine farklı tepki scip-3.2.0/applications/Coloring/MakefileAşağıdaki yerlerde de bağlı iki kere umask. Oluşturulan 1. kişi size yazılı erişim izni vermezse, 2. deneme başarısız olur.
dan

1
@DW Bunun neden bir çelişki olmadığını açıklayan bir cevap ekledim .
Adam Litre,

1

Mac OSX için kullandığım alternatif, ücretsiz, hafif bir arşiv yazılımı var. Buna Keka deniyor ve bunu 7zip paketini açmak için kullanıyorum. Dahası, .rar, .tar, .gz vb. Gibi diğer türleri de açabilir. OP'nin belirli tar dosyası için de işe yaradı, ancak @Geoff ekibin dosyayı tamir etmeye çalıştığını söyledikten sonra denedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.