Gizli dosyalar dışında bir dizinin tar arşivi oluşturulsun mu?


17

Belirli bir dizinin bir tar arşivi oluşturmak istiyorum (tabii ki onun alt dizinleri ile). Ama bunu yaptığımda, tar komutunu kullanarak, dahil olan dosyaların bir listesini alıyorum, örneğin:

bir calendar_final /._ style.css

bir calendar_final / style.css

Gördüğünüz gibi, aynı dosyanın iki sürümü var. Bu her dosya için geçerli ve birçok dosya var. ._ öneki olan geçici dosyaları katran arşivinden nasıl hariç tutabilirim?



Bunlar geçici dosyalar değildir, ancak OS X dosya sistemi meta verilerini temsil eder (yanılmıyorsam, Finder etiketlerini, türünü ve yaratıcı kodlarını, genişletilmiş öznitelikleri vb. İçerir). OS X üzerinde katran oluşturmadan önce bu dosyalar mevcut değildir. Olası yanıtlar OS X / HFS + veya başka bir sistemde bulunmanıza bağlıdır.
Daniel Beck

Yanıtlar:


33

Bir Mac OS X sistemi üzerinde çalıştığınızı belirten bir yorum gönderdiniz. Bu, bu ._*dosyaların amacı için önemli bir ipucudur .

Bu ._*arşiv girişleri , karşılık gelen dosyayla ( öneksiz olan) ilişkili ek bilgileri içeren AppleDouble veri parçalarıdır ._. Mac OS X'e özgü copyfile (3) işlev ailesi tarafından oluşturulur. AppleDouble blobları erişim kontrol verilerini (ACL) ve genişletilmiş öznitelikleri (genellikle Finder bayrakları ve “kaynak çatalları” depolar, ancak xattrs her türlü veriyi depolamak için kullanılabilir).

Sistem tarafından sağlanan Mac OS X arşiv araçları ( bsdtar(ayrıca symlink olarak da adlandırılır tar) gnutar, ve pax) ._*kendisiyle ilişkili genişletilmiş bilgilere sahip herhangi bir dosya için bir arşiv üyesi oluşturur ; “arşivden çıkar” modunda, bu arşiv üyelerinin de kodunu çözer ve ortaya çıkan genişletilmiş bilgileri ilişkili dosyaya uygularlar. Bu, HFS + dosya sisteminin saklayabileceği tüm bilgileri koruyarak ve daha sonra çıkararak Mac OS X sistemlerinde kullanılmak üzere bir “tam uyum” arşivi oluşturur.

Diğer sistemlerde karşılık gelen arşiv araçları, bu ._*dosyalara özel işlem yapmayı bilmez , bu nedenle normal dosyalar olarak paketten çıkarılırlar. Bu tür dosyalar diğer sistemlerde oldukça işe yaramaz olduğundan, genellikle “gereksiz dosyalar” olarak görülürler. Buna uygun olarak, Mac OS X olmayan bir sistemle başlayan normal dosyaları içeren bir arşiv oluşturursa ._, Mac OS X arşivden çıkarma araçları bu dosyaları genişletilmiş bilgi olarak deşifre etmeye çalışır.

Bununla birlikte, sistem tarafından sağlanan Mac OS X arşivleyicilerinin diğer Unixy sistemlerinde olduğu gibi davranmasının belgelenmemiş (?) Bir yolu vardır: COPYFILE_DISABLE ortam değişkeni. Bu değişkenin (herhangi bir değere, hatta boş dizeye) ayarlanması, arşivleyicilerin ._*arşivlenen dosyalarla ilişkili tüm genişletilmiş bilgileri temsil etmelerini engeller . Varlığı ayrıca arşivcilerin bu tür arşiv üyelerini genişletilmiş bilgi olarak yorumlamaya çalışmasını da engelleyecektir.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Eğer daha sık çalışmak istemiyorsanız, bu değişkeni kabuğunuzun başlatma dosyasında ayarlayabilirsiniz.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Ardından, özelliği yeniden etkinleştirmeniz gerektiğinde (genişletilmiş bilgileri korumak / geri yüklemek için), bağımsız komutlar için değişkenin “ayarını kaldırabilirsiniz”:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Mac OS X 10.4'teki arşivleyiciler de farklı bir ortam değişkeni kullanıyor olsalar da benzer bir şey yapıyorlar: COPY_EXTENDED_ATTRIBUTES_DISABLE


kimse işe yaramadı gördü? Yosemite üzerinde bu çözümü denedim ve bir AIX kutusunda unzip zaman PaxHeader dizinleri hala oluşturulur
conorgriffin

5

Bu çalışmalı:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'


Tuhaf, hangi tar sürümünü kullanıyorsun? tar --versionburada GNU 1,23 veriyor.
Frederik Deweerdt

1
Bu dosyalar OS X'te dosya sistemi meta verileridir ve tar çalıştırılmadan önce mevcut değildir, bu nedenle muhtemelen bu şekilde dışlanamaz. Bunlar, başka bir Mac'te arşivlenirken OS X dosya meta verilerinin geri yüklenmesine izin vermek için dahil edilmiştir.
Daniel Beck

Benim için çalışıyor. tar vzcf ...Yanlış dosyaların dahil edilip edilmediğini görmek için kullanmanızı öneririm .
stribika

@stribika Büyük olasılıkla OS X'te. Soru hakkındaki yorumuma bakın. Tar arşivi dışında bulunmadığından dosyalar hariç tutulamaz.
Daniel Beck

2

Frederik Deweerdt GNU tar (Linux, Cygwin, FreeBSD, OSX, muhtemelen diğerleri üzerinde kullanılır) üzerinde çalışan ancak NetBSD, OpenBSD veya Solaris gibi diğer sistemlerde çalışmayan bir çözüm verdi.

POSIX tarkomutu belirtmez (çünkü unix varyantları arasında çok çılgınca değişir) ve paxbunun yerine komutu verir. Seçenek -w, bir arşiv üretmek ( -rayıklar) anlamına gelir -xve arşiv biçimini seçer. Bu seçenek -s '!BRE!!', yolu temel normal ifade BRE ile eşleşen tüm dosyaları hariç tutar.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

İlginç ... Kişi hakkında bilmiyordum.
gabe.

2

İtibariyle bsdtar 3.0.3 - libarchive 3.0.3(ve belki de daha erken) yeni (Mac OS X özel) seçeneği vardır bsdtardenir komuta --disable-copyfileoluşturulmasını bastırmak için ._dosyaları. Eski sürümleri taryok --disable-copyfileseçeneği, ama ortam değişkeni COPYFILE_DISABLE=1çalışmalıdır.


İle bsdtar 2.8.3 - libarchive 2.8.3arasında yine belgelenmiş ancak mevcut değildir. 10.7.5--disable-copyfile
Stefan Schmidt

0

Bu adımları takip et:

  1. Tüm ._dosyaları bulun ve bunları listeleyerek -lstüm ._dosyaları görebilir ve son olarak silebilirsiniz.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Arşiv .tar kullanarak oluşturun.

    tar -cvf name.tar /path/to/directory
    
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.