Perintah shell ke direktori tar tidak termasuk file / folder tertentu

811

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=PATTERNperintah 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=fileuntuk 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 .
deepwell
sumber
120
Hal lain yang menarik perhatian saya, mungkin patut dicatat: Garis miring pada akhir folder yang dikecualikan akan menyebabkan tar tidak mengecualikan folder itu sama sekali.
Rekhyt
7
@Rekhyt terima kasih, saya menatap perintah selama 15 menit ... lalu 30
earcam
9
Tampaknya posisi --exclude tergantung pada versi tar. Untuk tar 1.23, --exclude perlu datang setelah perintah utama.
Joel G Mathew
2
Jangan lupakan "'" (tanda kutip).
Meetai.com
3
--excludetidak harus menjadi yang pertama tetapi harus datang ke suatu tempat sebelum direktori sumber (diuji dengan tar 1.29 di Cygwin).
singkat

Jawaban:

1038

Anda dapat memiliki beberapa opsi kecualikan untuk tar

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

dll akan bekerja. Membuat yakin untuk menempatkan --exclude sebelum sumber dan tujuan item.

Charles Ma
sumber
78
Jawaban ini membuatnya tampak seperti --exclude datang lebih dulu ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien
13
Sebagai contoh, jika Anda mencoba membuat cadangan folder proyek wordpress Anda, tidak termasuk folder unggah, Anda dapat menggunakan perintah ini: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / unggahan
shasi kanth
12
Saya datang dengan perintah berikut: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . perhatikan bahwa -fbendera harus mendahului file tar lihat: superuser.com/a/559341/415047
Alfred Bez
21
Tanda "/" pada akhir direktori pengecualian akan menyebabkannya gagal. Saya kira tar berpikir akhiran / adalah bagian dari nama direktori untuk dikecualikan. BURUK: --exclude = mydir / GOOD: --exclude = mydir
Josiah
4
> Pastikan untuk meletakkan --exclude sebelum item sumber dan tujuan. ATAU gunakan jalur absolut untuk pengecualian: tar -cvpzf backups / target.tar.gz --exclude = '/ home / username / backups / home / username
NightKnight on Cloudinsidr.com
131

Anda dapat mengecualikan direktori dengan --excludeuntuk tar.

Jika Anda ingin mengarsipkan semuanya kecuali /usrAnda dapat menggunakan:

tar -zcvf /all.tgz / --exclude=/usr

Dalam kasus Anda, mungkin sesuatu seperti

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Johan Soderberg
sumber
17
Untuk memperjelas, Anda dapat menggunakan path lengkap untuk --exclude.
Johan Soderberg
2
dalam beberapa kasus, diharuskan --exclude mendahului file / folder untuk diarsipkan
kronuus
68

Opsi yang memungkinkan untuk mengecualikan file / direktori dari cadangan menggunakan tar:

Kecualikan file menggunakan beberapa pola

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Kecualikan file menggunakan file kecualikan yang diisi dengan daftar pola

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Kecualikan file menggunakan tag dengan menempatkan file tag di direktori apa pun yang harus dilewati

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Stephen Donecker
sumber
3
Urutan parameter tampaknya penting dan formulir ini berfungsi untuk saya.
cstamas
1
Saya juga. Untuk tar (GNU tar) 1.28 di Ubuntu 16.04, hanya urutan parameter khusus ini yang berfungsi.
alvaroreig
43

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

/home/ftp/mysite/

dengan file / folder berikut

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

jadi, Anda ingin membuat file tar yang berisi everyting di dalam / home / ftp / mysite (untuk memindahkan situs ke server baru), tetapi file3hanya sampah, dan semua yang ada difolder3 juga tidak diperlukan, jadi kami akan melewati keduanya.

kami menggunakan format

tar -czvf <name of tar file> <what to tar> <any excludes>

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

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

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)

Sverre
sumber
6
Jawaban ini pasti membantu saya! Gotcha bagi saya adalah bahwa perintah saya terlihat seperti tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', dan ini tidak mengecualikan apa pun.
Anish Ramaswamy
2
Sampel Anda sangat mirip dengan apa yang saya miliki masalah! Terima kasih!
Qorbani
2
Bagus dan jelas terima kasih. Bagi saya masalahnya adalah bahwa jawaban lain termasuk absolut dari jalur relatif. Tapi yang harus Anda lakukan adalah menambahkan nama folder yang ingin Anda kecualikan.
Hubert
2
Ini jawaban yang jauh lebih jelas. Karena contoh itu saya bisa membuatnya bekerja karena jalan awalnya membingungkan. Terima kasih banyak!
fagiani
2
itu berhasil! Harap diingat untuk tidak menambahkan garis miring pada pengecualian. Misalnya, ketika "file3" atau "file3 / subfolder" berfungsi, "file3 /" dan "file3 / subfolder /" tidak!
lucaferrario
24

Anda dapat menggunakan "notasi semut" standar untuk mengecualikan direktori relatif.
Ini berfungsi untuk saya dan mengecualikan direktori .git atau node_module:

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt berisi:

/ dev2 / java
/ dev2 / javascript

Eric Manley
sumber
4
Saya percaya ini mengharuskan variabel opsi Bash shell globstarharus diaktifkan. Periksa dengan shopt -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. "
not2qubit
15

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:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

yang tidak bekerja:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Ini, sementara tar --helpmengungkapkan hal berikut:

tar [OPTION...] [FILE]

Jadi, perintah kedua juga harus bekerja, tetapi tampaknya itu tidak terjadi ...

Rgds terbaik,

GeertVc
sumber
5
Hanya ingin menambahkan di atas, bahwa penting bahwa direktori yang dikecualikan TIDAK boleh berisi backslash final. Jadi, --exclude = '/ path / ke / mengecualikan / dir' adalah BENAR , --exclude = '/ path / ke / mengecualikan / dir /' adalah SALAH .
GeertVc
17
ini karena target arsip target.tgz adalah argumen dari saklar f, yang harus diikuti
Valentino
14

Pola kecualikan ini menangani akhiran nama file seperti png atau mp3 serta nama direktori seperti .git dan node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Scott Stensland
sumber
terima kasih - itulah yang saya cari :)
Alexander Br.
11

Bagi mereka yang memiliki masalah dengan itu, beberapa versi tar hanya akan berfungsi dengan baik tanpa './' dalam nilai kecualikan.

Tar --version

tar (GNU tar) 1.27.1

Perintah sintaks yang berfungsi:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Ini tidak akan berfungsi:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
J. Lawson
sumber
10

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):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
rampok
sumber
2
Terima kasih atas jawaban ini, tar pada darwin pasti memiliki sintaks yang berbeda dan itu membuat saya gila mengapa "--exclude = blah" di jawaban lain tidak berfungsi. Ini bekerja sangat baik pada mac.
Michael
1
Jangan lupa COPYFILE_DISABLE=1saat menggunakan tar, jika tidak, Anda mungkin mendapatkan file ._ di tarball Anda
Benoit Duffez
Terima kasih telah memasukkan jawaban Anda. Selalu menyenangkan untuk menyertakan tautan ke sumber tempat Anda menemukan jawabannya. Bonus: jika sumbernya dari stackoverflow atau posting stackexchange lain, Anda mendapatkan karma tambahan (baik poin atau lencana - saya tidak ingat yang mana). Bagaimanapun, mereka mendapatkan senyum, dan semua orang menang. Tidak ada kerugian :-) Ini juga membantu orang-orang yang ingin mencari info tambahan. Terkadang orang-orang akan berubah pendapat hanya karena Anda menyertakan tautan sumber. Akhirnya, berbagi masalah spesifik yang dibahas ini, atau mengapa ini merupakan solusi yang lebih baik, mungkin membantu orang lain dengan masalah unik.
SherylHohman
8

Untuk Mac OSX harus saya lakukan

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Perhatikan -fsetelah--exclude=

Jerinaw
sumber
6

Saya setuju bahwa flag --exclude adalah pendekatan yang tepat.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

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)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • 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'

Aaron Votre
sumber
5

Untuk menghindari kemungkinan 'xargs: Argument list too long'kesalahan karena penggunaan find ... | xargs ...saat memproses puluhan ribu file, Anda dapat menyalurkan output findlangsung ke tarpenggunaan find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
carlo
sumber
Anda dapat mengutip string 'kecualikan', seperti ini: 'somedir / filesdir / *' maka shell tidak akan memperluas tanda bintang dan karakter putih lainnya.
Znik
xargs -n 1adalah pilihan lain untuk menghindari xargs: Argument list too longkesalahan;)
Tuxdude
5

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:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

Menambahkan wildcard setelah direktori yang dikecualikan akan mengecualikan file tetapi mempertahankan direktori:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Mike
sumber
Pada contoh kedua di atas harus ada tanda bintang setelah garis miring terakhir di setiap klausa yang dikecualikan, tetapi pos tidak mengambilnya.
Mike
4

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).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
Alex B
sumber
4

Anda juga dapat menggunakan salah satu opsi "--exclude-tag" tergantung kebutuhan Anda:

  • --exclude-tag = FILE
  • --exclude-tag-all = FILE
  • --exclude-tag-under = FILE

Folder yang menampung FILE yang ditentukan akan dikecualikan.

darimelmak
sumber
4

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:

  1. PESAN DARI PILIHAN MASALAH: tidak sama dengan menaruh --exclude sebelum daripada setelah opsi file dan direktori untuk dicadangkan. Ini tidak terduga, setidaknya bagi saya, karena dalam pengalaman saya, dalam perintah GNU / Linux, biasanya urutan opsi tidak masalah.
  2. Versi tar yang berbeda mengharapkan opsi ini dalam urutan yang berbeda: misalnya, jawaban @ Andrew menunjukkan bahwa dalam GNU tar v 1.26 dan 1.28 pengecualian dikeluarkan terakhir, sedangkan dalam kasus saya, dengan GNU tar 1.29, itu sebaliknya.
  3. MASALAH SLASH TRAILING : setidaknya di GNU tar 1.29, seharusnya tidak ada .

Dalam kasus saya, untuk GNU tar 1.29 pada Debian stretch, perintah yang berfungsi adalah

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

Kutipan tidak masalah, itu bekerja dengan atau tanpa mereka.

Semoga ini bermanfaat bagi seseorang.

pengguna2553863
sumber
Terima kasih atas jawaban Anda. Saya mencari (yang terasa seperti waktu yang sangat lama) untuk solusi, dan jawaban Anda membimbing saya ke arah yang benar. Namun, dalam kasus saya (Ubuntu 18.04.3, Tar 1.29) Saya hanya bisa membuatnya bekerja dengan menambahkan nama folder dan BUKAN path, misalnya: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. folder tgz
Nitai
2

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:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
camh
sumber
2

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

Andrew
sumber
Setelah banyak percobaan saya menemukan kurang lebih hal yang sama dengan perintah saya tar (GNU tar) 1.28.
PicoutputCls
2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-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.

Ashwini Gupta
sumber
Saya pikir, ini adalah solusi terbaik, karena bahkan berfungsi dalam kasus-kasus itu, jumlah pengecualiannya besar. Dimungkinkan juga untuk memasukkan opsi X dalam paket opsi, jadi bentuk terpendek mungkin adalah:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke
0

Taruhan terbaik Anda adalah menggunakan find dengan tar, melalui xargs (untuk menangani sejumlah besar argumen). Sebagai contoh:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Joe
sumber
4
Itu dapat menyebabkan tar dipanggil beberapa kali - dan juga akan mengemas file berulang kali. Yang benar adalah:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen
Saya membaca di suatu tempat bahwa ketika menggunakan xargs, seseorang harus menggunakan ropsi tar alih-alih ckarena ketika findbenar-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 oleh xargsdan tidak semua hasil ditemukan oleh findperintah.
Stphane
0

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 /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

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

George
sumber
0

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:

zip -r /backup/filename.zip. -x unggah / folder / ** \ * unggah / folder2 / ** \ *

(CATATAN: Ini adalah pos yang semula saya gunakan yang membantu saya /superuser/312301/unix-zip-directory-but-excluded-specific-sdubdirectories-and-everything-within-t )

pengguna2792605
sumber
3
Waspadalah: ziptidak mengemas direktori kosong, tetapi tarmelakukan!
t0r0X
0

Coba lihat

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
RohitPorwal
sumber
0

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:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
dobrivoje
sumber
0

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:

  1. 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.

Sridhar Kumar N
sumber
0

Jika Anda mencoba mengecualikan file Version Control System (VCS), tar sudah mendukung dua opsi menarik tentangnya! :)

  1. Opsi: --exclude-vcs

Opsi ini mengecualikan file dan direktori yang digunakan dengan mengikuti sistem kontrol versi: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, dan Darcs.

Pada versi 1.32, file-file berikut tidak termasuk:

  • CVS/, dan semua yang ada di bawahnya
  • RCS/, dan semua yang ada di bawahnya
  • SCCS/, 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

    1. Opsi: --exclude-vcs-ignores

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 .gitfileberada 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: globberalih ke shell pola globbing. Garis syntax: regexpberalih kembali. Komentar dimulai dengan a #. Pola memengaruhi direktori dan semua subdirektori.

  1. Contoh

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/

TM
sumber
-1

Script bash berikut harus melakukan trik. Ini menggunakan jawaban yang diberikan di sini oleh Marcus Sundman.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

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 '.

James
sumber
1
Membutuhkan input interaktif adalah pilihan desain yang buruk untuk sebagian besar skrip shell. Jadikan itu membaca parameter baris perintah sebagai gantinya dan Anda mendapatkan manfaat dari penyelesaian tab shell, penyelesaian sejarah, pengeditan riwayat, dll.
tripleee
1
Selain itu, skrip Anda tidak berfungsi untuk jalur yang berisi karakter spasi whaspace atau shell. Pada dasarnya Anda harus selalu memasukkan variabel dalam tanda kutip ganda kecuali Anda secara spesifik memerlukan shell untuk melakukan tokenization whitespace dan ekspansi wildcard. Untuk detailnya, silakan lihat stackoverflow.com/questions/10067266/…
tripleee