Apakah ada perintah / skrip shell sederhana yang mendukung mengecualikan file / folder tertentu agar tidak diarsipkan?
Saya memiliki direktori yang perlu diarsipkan dengan sub direktori yang memiliki sejumlah file sangat besar yang tidak perlu saya backup.
Tidak cukup solusinya:
The tar --exclude=PATTERN
perintah sesuai dengan pola yang diberikan dan tidak termasuk file-file, tapi aku butuh file tertentu & folder untuk diabaikan (path file penuh), jika tidak file yang valid mungkin dikecualikan.
Saya juga bisa menggunakan perintah find untuk membuat daftar file dan mengecualikan yang saya tidak ingin mengarsipkan dan meneruskan daftar ke tar, tetapi itu hanya bekerja dengan sejumlah kecil file. Saya punya puluhan ribu.
Saya mulai berpikir satu-satunya solusi adalah membuat file dengan daftar file / folder yang akan dikecualikan, kemudian menggunakan rsync dengan --exclude-from=file
untuk menyalin semua file ke direktori tmp, dan kemudian menggunakan tar untuk mengarsipkan direktori itu.
Adakah yang bisa memikirkan solusi yang lebih baik / lebih efisien?
EDIT: Solusi Charles Ma bekerja dengan baik. Gotcha besar adalah bahwa --exclude='./folder'
HARUS berada di awal perintah tar. Perintah penuh (cd pertama, jadi cadangan relatif terhadap direktori itu):
cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
--exclude
tidak harus menjadi yang pertama tetapi harus datang ke suatu tempat sebelum direktori sumber (diuji dengan tar 1.29 di Cygwin).Jawaban:
Anda dapat memiliki beberapa opsi kecualikan untuk tar
dll akan bekerja. Membuat yakin untuk menempatkan
--exclude
sebelum sumber dan tujuan item.sumber
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
perhatikan bahwa-f
bendera harus mendahului file tar lihat: superuser.com/a/559341/415047Anda dapat mengecualikan direktori dengan
--exclude
untuk tar.Jika Anda ingin mengarsipkan semuanya kecuali
/usr
Anda dapat menggunakan:Dalam kasus Anda, mungkin sesuatu seperti
sumber
Opsi yang memungkinkan untuk mengecualikan file / direktori dari cadangan menggunakan tar:
Kecualikan file menggunakan beberapa pola
Kecualikan file menggunakan file kecualikan yang diisi dengan daftar pola
Kecualikan file menggunakan tag dengan menempatkan file tag di direktori apa pun yang harus dilewati
sumber
pertanyaan lama dengan banyak jawaban, tetapi saya menemukan bahwa tidak ada yang cukup jelas bagi saya, jadi saya ingin menambahkan percobaan saya.
jika Anda memiliki struktur berikut
dengan file / folder berikut
jadi, Anda ingin membuat file tar yang berisi everyting di dalam / home / ftp / mysite (untuk memindahkan situs ke server baru), tetapi
file3
hanya sampah, dan semua yang ada difolder3
juga tidak diperlukan, jadi kami akan melewati keduanya.kami menggunakan format
di mana c = create, z = zip, dan v = verbose (Anda dapat melihat file saat dimasukkan, berguna untuk memastikan tidak ada file yang Anda kecualikan yang ditambahkan). dan f = file.
jadi, perintah saya akan terlihat seperti ini
perhatikan file / folder yang dikecualikan relatif ke root tar Anda (saya telah mencoba path lengkap di sini relatif ke / tapi saya tidak bisa membuatnya bekerja).
harap ini akan membantu seseorang (dan saya lain kali saya google)
sumber
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
, dan ini tidak mengecualikan apa pun.Anda dapat menggunakan "notasi semut" standar untuk mengecualikan direktori relatif.
Ini berfungsi untuk saya dan mengecualikan direktori .git atau node_module:
myInputFile.txt berisi:
/ dev2 / java
/ dev2 / javascript
sumber
globstar
harus diaktifkan. Periksa denganshopt -s globstar
. Saya pikir itu mati secara default pada sebagian besar OS berbasis unix. Dari manual Bash: " globstar: Jika diatur, pola yang**
digunakan dalam konteks ekspansi nama file akan cocok dengan semua file dan nol atau lebih direktori dan subdirektori. Jika polanya diikuti oleh '/', hanya direktori dan subdirektori yang cocok. "Saya sudah mengalaminya, setidaknya dengan Cygwin tar versi saya gunakan ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" di Windows XP Home Edition Mesin SP3), urutan opsi penting.
Sementara konstruksi ini bekerja untuk saya:
yang tidak bekerja:
Ini, sementara
tar --help
mengungkapkan hal berikut:Jadi, perintah kedua juga harus bekerja, tetapi tampaknya itu tidak terjadi ...
Rgds terbaik,
sumber
Pola kecualikan ini menangani akhiran nama file seperti png atau mp3 serta nama direktori seperti .git dan node_modules
sumber
Bagi mereka yang memiliki masalah dengan itu, beberapa versi tar hanya akan berfungsi dengan baik tanpa './' dalam nilai kecualikan.
Perintah sintaks yang berfungsi:
Ini tidak akan berfungsi:
sumber
Saya menemukan ini di tempat lain sehingga saya tidak akan mengambil kredit, tetapi bekerja lebih baik daripada solusi di atas untuk masalah spesifik mac saya (meskipun ini ditutup):
sumber
COPYFILE_DISABLE=1
saat menggunakan tar, jika tidak, Anda mungkin mendapatkan file ._ di tarball AndaUntuk Mac OSX harus saya lakukan
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Perhatikan
-f
setelah--exclude=
sumber
Saya setuju bahwa flag --exclude adalah pendekatan yang tepat.
Sebuah kata peringatan untuk efek samping yang tidak saya temukan segera jelas: Pengecualian 'fileA' dalam contoh ini akan mencari 'fileA' secara berulang !
Contoh: Direktori dengan subdirektori tunggal berisi file dengan nama yang sama (data.txt)
Jika menggunakan
--exclude='data.txt'
arsip tidak akan berisi BAIK berkas data.txt. Ini dapat menyebabkan hasil yang tidak terduga jika pengarsipan perpustakaan pihak ketiga, seperti direktori node_modules.Untuk menghindari masalah ini, pastikan untuk memberikan seluruh jalur, seperti
--exclude='./dirA/data.txt'
sumber
Untuk menghindari kemungkinan
'xargs: Argument list too long'
kesalahan karena penggunaanfind ... | xargs ...
saat memproses puluhan ribu file, Anda dapat menyalurkan outputfind
langsung ketar
penggunaanfind ... -print0 | tar --null ...
.sumber
xargs -n 1
adalah pilihan lain untuk menghindarixargs: Argument list too long
kesalahan;)Setelah membaca utas ini, saya melakukan sedikit pengujian pada RHEL 5 dan berikut adalah hasil saya untuk mendapatkan direktori abc:
Ini akan mengecualikan kesalahan direktori dan log dan semua file di bawah direktori:
Menambahkan wildcard setelah direktori yang dikecualikan akan mengecualikan file tetapi mempertahankan direktori:
sumber
Gunakan perintah find bersamaan dengan opsi tar append (-r). Dengan cara ini Anda dapat menambahkan file ke tar yang ada dalam satu langkah, alih-alih solusi dua pass (buat daftar file, buat tar).
sumber
Anda juga dapat menggunakan salah satu opsi "--exclude-tag" tergantung kebutuhan Anda:
Folder yang menampung FILE yang ditentukan akan dikecualikan.
sumber
Setelah membaca semua jawaban yang bagus untuk versi yang berbeda dan setelah menyelesaikan masalah untuk diri saya sendiri, saya pikir ada detail yang sangat kecil yang sangat penting, dan jarang untuk penggunaan umum GNU / Linux , yang tidak cukup ditekankan dan layak mendapatkan lebih dari komentar.
Jadi saya tidak akan mencoba menjawab pertanyaan untuk setiap kasus, tetapi sebaliknya, cobalah mendaftar ke mana harus mencari ketika semuanya tidak berfungsi.
INI SANGAT PENTING UNTUK PEMBERITAHUAN:
Dalam kasus saya, untuk GNU tar 1.29 pada Debian stretch, perintah yang berfungsi adalah
Kutipan tidak masalah, itu bekerja dengan atau tanpa mereka.
Semoga ini bermanfaat bagi seseorang.
sumber
Anda dapat menggunakan cpio (1) untuk membuat file tar. cpio mengambil file untuk diarsipkan di stdin, jadi jika Anda sudah menemukan perintah find yang ingin Anda gunakan untuk memilih file arsip, pipa ke cpio untuk membuat file tar:
sumber
gnu tar v 1.26 --exclude harus muncul setelah arsip file dan argumen direktori cadangan, tidak boleh memiliki garis miring atau garis miring, dan lebih suka tanpa tanda kutip (tunggal atau ganda). Jadi relatif terhadap direktori PARENT yang akan didukung, itu:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
sumber
tar (GNU tar) 1.28
.-X menunjukkan file yang berisi daftar nama file yang harus dikeluarkan dari cadangan. Untuk Instance, Anda dapat menentukan * ~ dalam file ini untuk tidak menyertakan nama file yang diakhiri dengan ~ dalam cadangan.
sumber
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Taruhan terbaik Anda adalah menggunakan find dengan tar, melalui xargs (untuk menangani sejumlah besar argumen). Sebagai contoh:
sumber
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
, seseorang harus menggunakanr
opsi tar alih-alihc
karena ketikafind
benar-benar menemukan banyak hasil, xargs akan membagi hasil tersebut (berdasarkan batas argumen baris perintah lokal) menjadi chuncks dan memanggil tar pada setiap bagian. Ini akan menghasilkan arsip yang berisi chunck terakhir yang dikembalikan olehxargs
dan tidak semua hasil ditemukan olehfind
perintah.Kemungkinan jawaban yang berlebihan tetapi karena saya merasa berguna, ini dia:
Ketika root FreeBSD (yaitu menggunakan csh) saya ingin menyalin seluruh filesystem root saya ke / mnt tetapi tanpa / usr dan (jelas) / mnt. Inilah yang berhasil (saya di /):
Seluruh poin saya adalah bahwa itu perlu (dengan menempatkan ./ ) untuk menentukan tar bahwa direktori yang dikecualikan di mana bagian dari direktori yang lebih besar sedang disalin.
€ 0,02 saya
sumber
Saya tidak beruntung mendapatkan tar untuk mengecualikan subdirektori 5 Gigabyte sedalam beberapa level. Pada akhirnya, saya hanya menggunakan perintah unix Zip. Itu bekerja jauh lebih mudah bagi saya.
Jadi untuk contoh khusus ini dari posting asli
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)
Persamaannya adalah:
(CATATAN: Ini adalah pos yang semula saya gunakan yang membantu saya /superuser/312301/unix-zip-directory-but-excluded-specific-sdubdirectories-and-everything-within-t )
sumber
zip
tidak mengemas direktori kosong, tetapitar
melakukan!Coba lihat
sumber
Saya ingin memiliki versi front-end baru (folder sudut) di localhost. Juga, folder git sangat besar dalam kasus saya, dan saya ingin mengecualikannya. Saya perlu mengunduhnya dari server, dan membukanya untuk menjalankan aplikasi.
Kompres folder sudut dari / var / lib / tomcat7 / webapps, pindahkan ke folder / tmp dengan nama angular.23.12.19.tar.gz
Perintah:
sumber
Kasus Sukses: 1) jika memberikan jalur lengkap untuk mengambil cadangan, selain itu juga harus digunakan jalur lengkap.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC
2) jika memberikan jalur saat ini untuk mengambil cadangan, selain itu juga harus digunakan jalur saat ini saja.
tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC
Kasus Kegagalan:
jika memberikan direktori jalur saat ini untuk mengambil cadangan dan jalur penuh untuk diabaikan, maka tidak akan berfungsi
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC
Catatan: menyebutkan mengecualikan sebelum / sesudah direktori cadangan baik-baik saja.
sumber
Jika Anda mencoba mengecualikan file Version Control System (VCS), tar sudah mendukung dua opsi menarik tentangnya! :)
Opsi ini mengecualikan file dan direktori yang digunakan dengan mengikuti sistem kontrol versi:
CVS
,RCS
,SCCS
,SVN
,Arch
,Bazaar
,Mercurial
, danDarcs
.Pada versi 1.32, file-file berikut tidak termasuk:
CVS/
, dan semua yang ada di bawahnyaRCS/
, dan semua yang ada di bawahnyaSCCS/
, dan semua yang ada di bawahnya.git/
, dan semua yang ada di bawahnya.gitignore
.gitmodules
.gitattributes
.cvsignore
.svn/
, dan semua yang ada di bawahnya.arch-ids/
, dan semua yang ada di bawahnya{arch}/
, dan semua yang ada di bawahnya=RELEASE-ID
=meta-update
=update
.bzr
.bzrignore
.bzrtags
.hg
.hgignore
.hgrags
_darcs
Ketika pengarsipan direktori yang berada di bawah beberapa sistem kontrol versi (VCS), sering nyaman untuk membaca pola pengecualian dari VCS ini' mengabaikan file (misalnya
.cvsignore
,.gitignore
, dll) Opsi ini memberikan kemungkinan tersebut.Sebelum pengarsipan direktori, melihat apakah mengandung salah satu berkas berikut:
cvsignore
,.gitignore
,.bzrignore
, atau.hgignore
. Jika demikian, baca abaikan pola dari file-file ini.Pola-pola diperlakukan banyak seperti VCS yang sesuai akan memperlakukan mereka, yaitu:
.cvsignore
Berisi pola globbing gaya shell yang hanya berlaku untuk direktori tempat file ini berada. Tidak ada komentar yang diizinkan dalam file. Baris kosong diabaikan.
.gitignore
Berisi pola globbing gaya shell. Berlaku untuk direktori di mana
.gitfile
berada dan semua subdirektori.Setiap baris yang diawali dengan
#
adalah komentar. Backslash lolos dari karakter komentar..bzrignore
Berisi shell globbing-pattern dan ekspresi reguler (jika diawali dengan
RE:
(16). Patterns mempengaruhi direktori dan semua subdirektorinya.Setiap baris yang diawali dengan
#
adalah komentar..hgignore
Berisi posix regular expressions (17). Garis
syntax: glob
beralih ke shell pola globbing. Garissyntax: regexp
beralih kembali. Komentar dimulai dengan a#
. Pola memengaruhi direktori dan semua subdirektori.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
sumber
Script bash berikut harus melakukan trik. Ini menggunakan jawaban yang diberikan di sini oleh Marcus Sundman.
Ini akan mencetak perintah yang Anda butuhkan dan Anda cukup menyalin dan menempelnya kembali. Mungkin ada cara yang lebih elegan untuk memberikannya langsung ke baris perintah.
Cukup ganti * .CC untuk ekstensi umum lainnya, nama file, atau regex yang ingin Anda kecualikan dan ini tetap bekerja.
EDIT
Hanya dengan menambahkan sedikit penjelasan; find menghasilkan daftar file yang cocok dengan regex yang dipilih (dalam hal ini * .CC). Daftar ini diteruskan melalui xargs ke perintah echo. Ini mencetak --mengecualikan 'satu entri dari daftar'. Garis miring () adalah karakter pelarian untuk tanda '.
sumber