Membuat arsip tar dari suatu direktori, kecuali file-file tersembunyi?

17

Saya ingin membuat arsip tar direktori tertentu (dengan subdirektori tentu saja). Tetapi ketika saya melakukannya, menggunakan perintah tar, saya mendapatkan daftar file yang disertakan, misalnya:

a calendar_final /._ style.css

a calendar_final / style.css

Seperti yang Anda lihat, ada dua versi file yang sama. Ini berlaku untuk setiap file, dan ada banyak. Bagaimana cara mengecualikan file sementara, dengan awalan ._, dari arsip tar?

Rui F Ribeiro
sumber
Ini mungkin membantu: unix.stackexchange.com/questions/2213/…
tshepang
Ini bukan file sementara, tetapi merupakan metadata sistem file OS X (jika saya tidak salah, mereka termasuk label Finder, jenis dan kode pembuat, atribut tambahan, dll.). File-file ini tidak ada sebelum membuat tar pada OS X. Jawaban yang mungkin tergantung pada apakah Anda menggunakan OS X / HFS + atau sistem lain.
Daniel Beck

Jawaban:

33

Anda memposting dalam komentar bahwa Anda bekerja pada sistem Mac OS X. Ini adalah petunjuk penting untuk tujuan ._*file - file ini .

._*Entri arsip ini adalah potongan dari data AppleDouble yang berisi informasi tambahan yang terkait dengan file yang sesuai (yang tanpa ._awalan). Mereka dihasilkan oleh keluarga fungsi spesifik copyfile (3) Mac OS X. AppleDouble blob menyimpan data kontrol akses (ACL) dan atribut yang diperluas (umumnya, bendera Finder dan “fork resource”, tetapi xattrs dapat digunakan untuk menyimpan segala jenis data).

Alat arsip Mac OS X yang disediakan oleh sistem ( bsdtar(juga dikaitkan sebagai tar) gnutar,, dan pax) akan menghasilkan anggota ._*arsip untuk file apa pun yang memiliki informasi tambahan yang terkait dengannya; dalam mode "unarchive", mereka juga akan men-decode anggota arsip tersebut dan menerapkan informasi tambahan yang dihasilkan ke file terkait. Ini menciptakan arsip "kesetiaan penuh" untuk digunakan pada sistem Mac OS X dengan menjaga dan kemudian mengekstrak semua informasi yang dapat disimpan oleh sistem file HFS +.

Alat arsip yang sesuai pada sistem lain tidak tahu untuk memberikan penanganan khusus untuk ._*file - file ini , sehingga mereka dibongkar sebagai file normal. Karena file seperti itu tidak berguna pada sistem lain, mereka sering dilihat sebagai "file sampah". Sejalan dengan itu, jika sistem non-Mac OS X menghasilkan arsip yang menyertakan file normal yang dimulai dengan ._, alat penguraian Mac OS X akan mencoba untuk memecahkan kode file-file itu sebagai informasi tambahan.

Namun, ada cara (?) Yang tidak berdokumen untuk membuat arsip Mac OS X yang disediakan sistem berperilaku seperti yang mereka lakukan pada sistem Unixy lainnya: variabel lingkungan COPYFILE_DISABLE. Mengatur variabel ini (ke nilai apa pun, bahkan string kosong), akan mencegah pengarsip dari menghasilkan ._*anggota arsip untuk mewakili setiap informasi tambahan yang terkait dengan file yang diarsipkan. Kehadirannya juga akan mencegah para pengarsip untuk mencoba menafsirkan anggota arsip tersebut sebagai informasi tambahan.

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

Anda dapat mengatur variabel ini dalam file inisialisasi shell Anda jika Anda ingin bekerja dengan cara ini lebih sering daripada tidak.

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

Kemudian, ketika Anda perlu mengaktifkan kembali fitur (untuk menyimpan / mengembalikan informasi yang diperluas), Anda dapat "menghapus" variabel untuk perintah individual:

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

Pengarsip pada Mac OS X 10.4 juga melakukan sesuatu yang serupa, meskipun mereka menggunakan variabel lingkungan yang berbeda: COPY_EXTENDED_ATTRIBUTES_DISABLE

Chris Johnsen
sumber
Adakah yang melihat ini tidak berfungsi? Saya sudah mencoba solusi ini pada Yosemite dan ketika saya unzip pada kotak AIX direktori PaxHeader masih dihasilkan
conorgriffin
5

Ini seharusnya bekerja:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
Frederik Deweerdt
sumber
Saya pikir itu berhasil tetapi sebenarnya ketika saya membongkar arsip, saya menemukan bahwa mereka telah dimasukkan: /
Aneh, versi tar mana yang Anda gunakan? tar --versionmemberi GNU 1.23 di sini.
Frederik Deweerdt
1
File-file itu adalah metadata sistem file pada OS X dan tidak ada sebelum menjalankan tar, jadi mungkin tidak dapat dikecualikan dengan cara ini. Mereka disertakan untuk memungkinkan memulihkan metadata file OS X saat membongkar arsip di Mac lain.
Daniel Beck
Bekerja untukku. Saya sarankan menggunakan tar vzcf ...untuk melihat apakah ada file yang salah dimasukkan.
stribika
@stribika Dia kemungkinan besar ada di OS X. Lihat komentar saya pada pertanyaan. File tidak dapat dikecualikan karena mereka tidak ada di luar arsip tar.
Daniel Beck
2

Frederik Deweerdt telah memberikan solusi yang berfungsi pada GNU tar (digunakan pada Linux, Cygwin, FreeBSD, OSX, mungkin yang lain), tetapi tidak pada sistem lain seperti NetBSD, OpenBSD atau Solaris.

POSIX tidak menentukan tarperintah (karena itu bervariasi terlalu liar antara varian unix) dan sebagai paxgantinya memperkenalkan perintah. Opsi tersebut -wberarti menghasilkan arsip ( -rekstrak), dan -xmemilih format arsip. Opsi ini -s '!BRE!!'mengecualikan semua file yang jalurnya cocok dengan BRE ekspresi reguler dasar.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Menarik ... Saya tidak tahu tentang pax.
gabe.
2

Pada bsdtar 3.0.3 - libarchive 3.0.3(dan mungkin sebelumnya) ada opsi (khusus Mac OS X) untuk bsdtarperintah yang dipanggil --disable-copyfileuntuk menekan pembuatan ._file. Versi lama dari tartidak memiliki --disable-copyfileopsi, tetapi pengaturan variabel lingkungan COPYFILE_DISABLE=1harus berfungsi.

mdm
sumber
Dengan bsdtar 2.8.3 - libarchive 2.8.3dari 10.7.5yang --disable-copyfiletidak didokumentasikan tetapi tersedia tetap.
Stefan Schmidt
0

Ikuti langkah ini:

  1. Temukan semua ._file dan daftarkan mereka menggunakan -lssehingga Anda dapat melihat semua ._file dan akhirnya menghapusnya.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Buat arsip .tar menggunakan.

    tar -cvf name.tar /path/to/directory
    
Ayush Dhanai
sumber