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ığı bsdtar
ve Linux sistemlerinin çoğunun kullandığı gerçeğinde yatmaktadır gnutar
.
Sen yükleyebilir gnutar
kullanarak, Homebrew ile Mac üzerinde brew install gnu-tar
sembolik bir link, hangi gnutar
içine /usr/local/bin
kadar 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ı gnutar
işleri bsdtar
kopyalarda boğulmaya neden olacak şekilde farklı şekilde arşivler . Aslında gtar -ztvf test.tar.gz
ikinci örneği indciates olduğu test/a
bir şekilde arşivlenir link to test/a
alakalıdır. Johnny, yorumlarda da belirtildiği gibi, gnutar
kopyaları, 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-dereference
bir 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-read
seç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ığı gnutar
zamanlarda 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 gnutar
ve 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.