Saya memiliki baris yang sangat sederhana ini dalam skrip bash yang dieksekusi dengan sukses (yaitu menghasilkan _data.tar
file), kecuali bahwa itu tidak mengecualikan sub-direktori yang dikatakan dikecualikan melalui --exclude
opsi:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Sebagai gantinya, ia menghasilkan _data.tar
file yang berisi semua yang ada di bawah / data, termasuk file dalam subdirektori yang ingin saya kecualikan.
Ada yang tahu kenapa? dan bagaimana cara memperbaikinya?
Pembaruan Saya menerapkan pengamatan saya berdasarkan tautan yang disediakan dalam jawaban pertama di bawah (dir level atas pertama, tidak ada spasi setelah dikecualikan terakhir):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Tapi itu tidak membantu. Semua sub-direktori "dikecualikan" hadir dalam _data.tar
file yang dihasilkan .
Ini membingungkan. Apakah ini bug dalam tar saat ini (GNU tar 1.23, pada CentOS 6.2, Linux 2.6.32) atau "sensitivitas ekstrim" tar terhadap spasi putih dan kesalahan ketik yang mudah dilewatkan lainnya, saya menganggap ini bug. Untuk sekarang.
Ini mengerikan : Saya mencoba wawasan yang disarankan di bawah ini (tidak tertinggal /*
) dan masih tidak berfungsi dalam skrip produksi:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Saya tidak dapat melihat perbedaan antara apa yang saya coba dan apa yang @Richard Perrin coba, kecuali untuk tanda kutip dan 2 spasi sebagai ganti 1. Saya akan mencoba ini (harus menunggu skrip nightly berjalan sebagai direktori yang akan didukung Facebook sangat besar) dan melaporkan kembali.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Saya mulai berpikir bahwa semua tar --exclude
kepekaan ini bukan tar melainkan sesuatu di lingkungan saya, tetapi kemudian apa yang bisa terjadi?
Berhasil! Variasi terakhir mencoba (tidak ada tanda kutip tunggal dan spasi tunggal alih-alih spasi ganda antara --exclude
s) yang diuji. Aneh tapi menerima.
Luar biasa! Ternyata versi yang lebih lama tar
(1.15.1) hanya akan mengecualikan jika level atas dir terakhir pada baris perintah. Ini adalah kebalikan dari bagaimana versi 1.23 membutuhkan. FYI.
--exclude b
(ruang bukan tanda sama) vs--exclude=b
. Apakah ini ada bedanya? (seharusnya tidak IMHO)--exclude=
pada baris yang sama. Jadi bedanya harus idiot/*
yang saya tambahkan ke setiap sub-direktori. Saya akan menguji ini malam ini dalam skrip produksi dan melaporkan kembali. +1 lainnya.Mungkin versi Anda
tar
mengharuskan--exclude
opsi harus ditempatkan di awaltar
perintah.Lihat: https://stackoverflow.com/q/984204
Lihat: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Alternatif:
Namun
tar
tip perintah lainnya adalah dari sini :sumber
--exclude=mydir/*
maka itu tidak berfungsi (menggunakantar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); Debian mungkin akan dikirim dengan banyak versi tar yang berbeda selama bertahun-tahun.--exclude
sebelumnya-czf
.Untuk mengecualikan beberapa file, coba
Ini akan menghemat beberapa kode dan sakit kepala. Ini adalah solusi global, untuk semua jenis program / opsi. Jika Anda juga ingin memasukkan direktori induk dalam pilihan Anda (dalam data kasus ini), Anda harus menyertakan koma jejak. Misalnya:
sumber
mv /very/very/very/very/long/path/to/a/file{,.bak}
Tautan ini mungkin bermanfaat. http://answers.google.com/answers/threadview/id/739467.html
Dua perbedaan langsung antara garis tidak bekerja dan beberapa kiat di tautan:
--exclude
.sumber
-MAK
menarik perhatian saya dan sejauh ini saya dapat menemukan perbedaan berikut antara garis tidak berfungsi saya dan yang berikut: 1. Semua pengecualian datang setelah direktori tingkat atas. 2. Tidak dapat memiliki ruang APAPUN setelah yang terakhir--exclude
. Saya akan menguji wawasan ini dan melaporkan kembali. +1 untuk saat ini.Solusinya mungkin menggunakan kombinasi
find ... -prune
dantar
untuk mengecualikan direktori yang ditentukan.Pada Mac OS X,
--exclude
opsi GNUtar
tampaknya berfungsi sebagaimana mestinya.Dalam kasus pengujian berikut, direktori
/private/var/log/asl
dan/private/var/log/DiagnosticMessages
harus dikeluarkan dari arsip terkompresi/private/var/log
direktori.sumber
Mungkin Anda dapat mencoba perintah dengan opsi lain:
Dan periksa apakah itu berjalan sebagaimana dimaksud.
sumber
Saya menggunakan mac, dan menemukan bahwa tidak termasuk tidak berfungsi kecuali folder tingkat atas adalah argumen terakhir
contoh perintah kerja:
FYI:
sumber
Dalam kasus saya, itu tidak mengecualikan untuk alasan yang berbeda.
Jalur lengkap vs jalur relatif.
Baik exclude dan direktori harus menggunakan format path yang sama (yaitu path lengkap atau path relatif)
Contoh:
Ini tidak akan berfungsi karena mengecualikan menggunakan jalur lengkap di mana sebagai target menggunakan jalur relatif
Ini berfungsi karena keduanya menggunakan path lengkap
Ini berfungsi karena keduanya menggunakan jalur relatif
sumber
Alih-alih
--exclude=
digunakan-X
dengan file teks:http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/
sumber
Catatan tambahan untuk jawaban sempurna R Perrin :
Misalkan Anda tidak ingin mengarsipkan jalur absolut tetapi relatif, misalnya 'data' alih-alih '/ tmp / data'. Untuk mengecualikan jalur absolut argumen tar Anda akan berbeda berdasarkan pada implementasi tar (gnu tar vs bsd tar) yang Anda gunakan:
sumber
Baru saja terdeteksi pada tar (GNU tar) 1.29
Panggilan ini tidak mengecualikan dari file arsip yang ditentukan dengan --exclude-from:
Panggilan ini bekerja dengan benar:
Urutan parameter penting!
sumber
Saya mencoba segala macam kombinasi termasuk beberapa jawaban yang terdaftar dan tidak bisa membuatnya untuk mengecualikan file yang terdaftar.
Jadi, muak mengejar jawaban atas apa yang seharusnya menjadi pekerjaan lima menit saya melakukan yang sebaliknya: membuat arsip folder yang ingin saya sertakan.
Saya melakukan ini dengan membuat arsip lalu menambahkannya :
Beberapa catatan:
tar
(dan bukan zip.tgz
/.tar.gz
) - Anda bisa menggantinya nantigzip mybackup.tar
tar tvf mybackup.tar
.sumber