Belirli dosyaları / klasörleri hariç tutarak tar dizinine Shell komutu


810

Belirli dosyaların / klasörlerin arşivlenmesini hariç tutmayı destekleyen basit bir kabuk komutu / komut dosyası var mı?

Yedeklemek gerekmez çok büyük dosyaları bir dizi olan bir alt dizini ile arşivlenmesi gereken bir dizin var.

Tam çözüm değil:

tar --exclude=PATTERNKomut verilen desen ve Kapsam dışı bu dosyaların maçları, ama belirli dosyaları ve klasörleri gözardı edilecektir (tam dosya yolu), aksi geçerli dosyalar dışarıda tutulmuştur gerekir.

Ayrıca, bir komut listesi oluşturmak ve arşivlemek ve listeyi tar'a aktarmak istemediklerimi hariç tutmak için find komutunu kullanabilirim, ancak bu yalnızca az miktarda dosyayla çalışır. On binlerce var.

Tek çözüm dışlanacak dosyalar / klasörler listesi olan bir dosya oluşturmak, sonra --exclude-from=filebir tmp dizinine tüm dosyaları kopyalamak için rsync kullanmak ve sonra bu dizini arşivlemek için tar kullanmak olduğunu düşünmeye başlıyorum .

Daha iyi / daha verimli bir çözüm düşünen var mı?

EDIT: Charles Ma'nın çözümü iyi çalışıyor. Büyük sorun , tar komutunun başında --exclude='./folder' OLMALIDIR . Tam komut (önce cd, yani yedekleme bu dizine görecelidir):

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

120
Beni bu konuda yakalayan başka bir şey, bir kayda değer olabilir: Hariç tutulan klasörlerin sonundaki eğik çizgiler , tar'ın bu klasörleri hiç dışlamamasına neden olur .
Rekhyt

7
@Rekhyt teşekkürler, komuta 15 dakika boyunca bakıyordum ... sonra 30
earcam

9
--Exclude'un konumu katran sürümüne bağlı gibi görünüyor. Katran 1.23 için, --exclude'un ana komutlardan sonra gelmesi gerekir.
Joel G Mathew

2
"" (Tırnak işaretleri) unutmayın.
Meetai.com

3
--excludeilk olmak zorunda değildir, ancak kaynak dizinden önce bir yere gelmelidir (Cygwin'de tar 1.29 ile test edilmiştir).
wortwart

Yanıtlar:


1038

Katran için birden fazla hariç tutma seçeneğiniz olabilir.

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

vb çalışacaktır. Make emin koymak için --exclude önce kaynak ve hedef öğeleri.


78
Bu cevap --exclude önce geliyor ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien

13
Örneğin, wordpress proje klasörünüzü, uploads klasörü hariç yedeklemeye çalışıyorsanız, şu komutu kullanabilirsiniz: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth

12
Aşağıdaki komutla geldim: bayrağın katran dosyasından önce gelmesi gerektiğini tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . unutmayın -f: bkz. Superuser.com/a/559341/415047
Alfred Bez

21
Hariç tutma dizininin sonundaki "/" dizinin başarısız olmasına neden olur. Bence tar bir son olduğunu / hariç tutmak için dizin adının bir parçası olduğunu düşünüyor. KÖTÜ: --exclude = mydir / İYİ: --exclude = mydir
Josiah

4
> Kaynak ve hedef öğelerin önüne --exclude yazdığınızdan emin olun. VEYA hariç tutmak için mutlak bir yol kullanın: tar -cvpzf backups / target.tar.gz --exclude = '/ home / kullanıcı adı / yedeklemeler' / home / kullanıcı adı
Cloudinsidr.com'da NightKnight

131

İle dizinleri hariç tutabilirsiniz --excludeİçin tar .

/usrKullanabileceğiniz dışındaki her şeyi arşivlemek istiyorsanız:

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

Sizin durumunuzda belki de

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

17
Açıklığa kavuşturmak için --exclude için tam yolu kullanabilirsiniz.
Johan Soderberg

2
bazı durumlarda, arşivlenecek dosyalardan / klasörlerden önce
--Exclude'un eklenmesi gerekir

68

Dosya / dizinleri tar kullanarak yedeklemenin dışında tutmak için olası seçenekler:

Birden çok desen kullanarak dosyaları hariç tutma

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

Desen listesiyle dolu bir hariç tutma dosyası kullanarak dosyaları hariç tutma

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

Atlanması gereken herhangi bir dizine bir etiket dosyası yerleştirerek etiketleri kullanarak dosyaları hariç tutma

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

3
Parametrelerin sıralaması önemli gibi görünüyor ve bu form benim için çalışıyor.
cstamas

1
Ben de. Ubuntu 16.04'teki katran (GNU katran) 1.28 için, yalnızca bu belirli parametre sırası çalıştı.
alvaroreig

43

birçok soru ile eski bir soru, ama hiçbiri benim için yeterince açık olmadığını buldum, bu yüzden denemek eklemek istiyorum.

Aşağıdaki yapıya sahipseniz

/home/ftp/mysite/

aşağıdaki dosya / klasörlerle

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

bu nedenle, / home / ftp / sitem içindeki her şeyi içeren bir tar dosyası yapmak istiyorsunuz (siteyi yeni bir sunucuya taşımak için), ancak file3sadece önemsiz ve her şeyfolder3 de gerek yoktur, bu yüzden bu ikisini atlayacağız.

formatı kullanıyoruz

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

burada c = create, z = zip ve v = ayrıntılı (dosyaları girildikçe görebilirsiniz, hariç tuttuğunuz dosyaların hiçbirinin eklenmediğinden emin olmak için yararlıdır). ve f = dosya.

yani, komutum şöyle görünecekti

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

hariç tutulan dosyaları / klasörleri nispeten katran kökü olduğunu unutmayın (Ben / göre tam yol burada denedim ama bu iş yapamaz).

umarım bu birisine yardımcı olur (ve bir dahaki sefere google’da)


6
Bu cevap kesinlikle bana yardımcı oldu! Benim için en önemli şey, komutumuntar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3' , ve bu hiçbir şeyi dışlamıyordu.
Anish Ramaswamy

2
Örneklem, sorun yaşadığım şeye çok benziyordu! Teşekkür ederim!
Qorbani

2
Güzel ve açık teşekkürler. Benim için sorun, diğer cevapların göreli yolların mutlak olmasıydı. Ancak tek yapmanız gereken hariç tutmak istediğiniz klasörün adını eklemektir.
Hubert

2
Bu çok daha açık bir cevap. Örnek yüzünden, yollar ilk başta kafa karıştırıcı olduğu için çalışmasını başardım. Çok teşekkürler!
fagiani

2
işe yaradı! Lütfen hariç tutmaya bir eğik çizgi eklememeyi unutmayın. Örneğin, "dosya3" veya "dosya3 / alt klasör" çalışırken, "dosya3 /" ve "dosya3 / alt klasör /" çalışmaz!
lucaferrario

24

Göreli dizinleri hariç tutmak için standart "karınca gösterimi" kullanabilirsiniz.
Bu benim için çalışır ve .git veya node_module dizinlerini hariç tutar:

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

myInputFile.txt içeriği:

/ dev2 / java
/ dev2 / javascript


4
Bu Bash kabuk seçenek değişkeni globstaretkinleştirilmesi gerektiğini düşünüyorum. İle kontrol edin shopt -s globstar. Çoğu unix tabanlı işletim sistemlerinde varsayılan olarak kapalı düşünüyorum . Bash manual'dan : " globstar: Ayarlanmışsa, **dosya adı genişletme bağlamında kullanılan desen tüm dosyalarla ve sıfır veya daha fazla dizin ve alt dizinle eşleşir. Deseni bir '/'
izlerse

15

Bunu yaşadım, en azından Cygwin "CYGWIN_NT-5,1 1.7.17 (0,262 / 5/ 3) 2012-10-19 14:39 i686 Cygwin" Windows XP Home Edition (katran sürümü kullanıyorum SP3 makinesi), seçeneklerin sırası önemlidir.

Bu inşaat benim için çalışırken:

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

kimse o vermedi çalışır:

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

Bu, tar --helpaşağıdakileri ortaya çıkarır:

tar [OPTION...] [FILE]

Yani, ikinci komut da işe yaramalı, ama görünüşe göre durum böyle görünmüyor ...

En iyi rgds,


5
Sadece yukarıdakilere eklemek istiyorum, hariç tutulacak dizinin son bir ters eğik çizgi içermemesi önemlidir. Yani, --exclude = '/ bir / yer / dışlama / dir' olduğu DOĞRU , '/ / yol / dışlama / dir /' --exclude = olduğunu YANLIŞ .
GeertVc

17
bunun nedeni target.tgz hedef arşivinin takip etmesi gereken f anahtarının bir argümanı olmasıdır
Valentino

14

Bu, desen, png veya mp3 gibi dosya adı sonekinin yanı sıra .git ve node_modules gibi dizin adlarını işler

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

teşekkürler - aradığım şey :)
Alexander Br.

11

Bununla ilgili sorunları olanlar için, katranın bazı sürümleri, hariç tutma değerinde './' olmadan yalnızca düzgün çalışır.

Tar --version

katran (GNU katranı) 1.27.1

Çalışan komut sözdizimi:

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

Bunlar çalışmaz:

$ 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 *

10

Kredi almayacağım, bu yüzden başka bir yerde buldum, ama benim mac özel sorunları için yukarıdaki çözümlerden herhangi daha iyi çalıştı (bu kapalı olsa bile):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

2
Bu cevap için teşekkürler, darwin üzerindeki katran kesinlikle farklı bir sözdizimine sahip ve diğer cevaplardaki "--exclude = blah" ın neden işe yaramadığı beni deli ediyordu. Bu bir mac üzerinde harika çalıştı.
Michael

1
COPYFILE_DISABLE=1Katran kullanırken unutma , aksi takdirde tarball'ında ._ dosyaları alabilirsin
Benoit Duffez

Cevabınızı eklediğiniz için teşekkür ederiz. Cevabı bulduğunuz kaynağa bir bağlantı eklemek her zaman güzeldir. Bonus: Eğer kaynak başka bir stackoverflow veya stackexchange gönderisindeyse, ekstra karma elde edersiniz (puanlar veya rozetler - hangisini hatırlamıyorum). Her iki durumda da, bir gülümseme alırlar ve herkes kazanır. Hiçbir dezavantajı :-) Ayrıca ekstra bilgi aramak isteyen insanlara yardımcı olur. Bazen insanlar sadece bir kaynak bağlantı eklediğiniz için vekil olurlar. Son olarak, bunun ele aldığı spesifik sorunu veya bunun neden daha iyi bir çözüm olduğunu paylaşmak, benzersiz bir sorunu olan başka birine yardımcı olabilir.
SherylHohman

8

Mac OSX için yapmam gerekiyordu

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

-fSonra not edin--exclude=


6

--Exclude bayrağının doğru yaklaşım olduğuna katılıyorum.

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

Hemen fark etmediğim bir yan etki için uyarı kelimesi : Bu örnekte 'fileA' nın hariç tutulması 'fileA' kelimesini arayacak.

Örnek: Aynı ada sahip bir dosya içeren tek bir alt dizine sahip bir dizin (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Kullanılıyorsa --exclude='data.txt'içermez arşivi YA data.txt dosyayı. Bu, node_modules dizini gibi üçüncü taraf kitaplıkları arşivlenirse beklenmeyen sonuçlara neden olabilir.

  • Bu sorunu önlemek için yolun tamamını verdiğinizden emin olun. --exclude='./dirA/data.txt'


5

Olası önlemek için 'xargs: Argument list too long'find ... | xargs ...On binlerce dosyayı işlerken kullanımından kaynaklanan hataları için , çıktısını finddoğrudan tarkullanmaya yönlendirebilirsiniz 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 -

'exclude' dizesini şu şekilde alıntılayabilirsiniz: 'somedir / filesdir / *' sonra kabuk yıldızları ve diğer beyaz karakterleri genişletmeyecektir.
Znik

xargs -n 1xargs: Argument list too longhatayı önlemek için başka bir seçenektir ;)
Tuxdude

5

Bu konuyu okuduktan sonra, RHEL 5 üzerinde küçük bir test yaptım ve işte abc dizinini tarring için sonuçlarım:

Bu, dizin hatasını ve günlükleri ve dizinlerin altındaki tüm dosyaları hariç tutar:

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

Dışlanan dizinden sonra joker karakter eklenmesi dosyaları hariç tutar, ancak dizinleri korur:

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

Yukarıdaki ikinci örnekte, her dışlama yantümcesindeki son eğik çizgiden sonra yıldız işaretleri olmalıdır, ancak gönderi onları almadı.
Mike

4

Find komutunu tar append (-r) seçeneğiyle birlikte kullanın. Bu şekilde, iki geçişli bir çözüm (dosya listesi oluştur, katran oluştur) yerine tek bir adımda mevcut bir tar dosyasına dosya ekleyebilirsiniz.

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

4

Gereksinimlerinize bağlı olarak "--exclude-tag" seçeneklerinden birini de kullanabilirsiniz:

  • --exclude-tag = DOSYA
  • --exclude-tag-all = DOSYA
  • --exclude-tag-under = DOSYA

Belirtilen FILE dosyasını barındıran klasör hariç tutulacak.


4

Farklı sürümler için tüm bu iyi yanıtları okuduktan ve sorunu kendim çözdükten sonra , GNU / Linux genel kullanımı için çok önemli ve nadir olan , yeterince vurgulanmayan ve yorumlardan daha fazlasını hak eden çok küçük detaylar olduğunu düşünüyorum .

Bu yüzden her vaka için soruyu cevaplamaya çalışmayacağım, ancak bunun yerine, işler işe yaramadığında nereye bakacağınızı kaydetmeye çalışacağım.

BİLDİRİM İÇİN ÇOK ÖNEMLİDİR:

  1. SEÇENEKLERİN SİPARİŞİ: --exclude'u önce dosya seçeneği ve yedeklenecek dizinlerden sonra koymakla aynı şey değildir. Bu en azından benim için beklenmedik bir şey, çünkü tecrübelerime göre GNU / Linux komutlarında genellikle seçeneklerin sırası önemli değil.
  2. Farklı katran sürümleri bu seçenekleri farklı bir sırayla bekler: örneğin, @ Andrew'un cevabı GNU tar v 1.26 ve 1.28'de hariç tutulanların son geldiğini gösterirken, benim durumumda GNU tar 1.29 ile diğer yol budur.
  3. TRAILING SLASHES ÖNEMLİ : en azından GNU kat 1.29'da , hiç olmamalı .

Benim durumumda, Debian streç üzerindeki GNU tar 1.29 için, çalışan komut

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

Alıntılar önemli değildi, onlarla birlikte ya da onlar olmadan çalıştı.

Umarım bu birisi için faydalı olur.


Cevabınız için teşekkür ederim. Bir çözüm arıyordum (çok uzun bir süre gibi hissettiren) ve cevabınız bana doğru yönde rehberlik etti. Ancak, benim durumumda (Ubuntu 18.04.3, Tar 1.29) Ben sadece klasör adını ve yolu DEĞİL ekleme ile çalışmasını sağlayabilir, örneğin: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. tgz klasörü
Nitai

2

Tar dosyaları oluşturmak için cpio (1) kullanabilirsiniz. cpio dosyaları stdin'de arşivlenecek şekilde alır, bu nedenle arşivi seçmek için kullanmak istediğiniz find komutunu daha önce çözdüyseniz, tar dosyasını oluşturmak için cpio'ya ekleyin:

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

2

gnu tar v 1.26 --exclude, arşiv dosyası ve yedekleme dizini bağımsız değişkenlerinden sonra gelmelidir, başından sonuna veya eğik çizgi olmamalı ve tırnak işaretleri (tek veya çift) tercih edilmemelidir. Yedeklenecek PARENT dizinine göre, bu:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude


Çok fazla denemeden sonra az çok aynı şeyi buldum tar (GNU tar) 1.28.
PicoutputCls

2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X, yedeklemeden çıkarılması gereken dosya adlarının listesini içeren bir dosyayı belirtir. Örnek için, yedekte ~ ile biten dosya adlarını içermemesi için bu dosyada * ~ belirtebilirsiniz.


Bence, bu durumlarda bile işe yaradığı için, hariç tutulanların sayısının fazla olduğu en iyi çözümdür. Seçenek seçeneğine X seçeneğini dahil etmek de mümkündür, bu yüzden en kısa form muhtemelen:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke

0

En iyi seçeneğiniz bulmayı xargs aracılığıyla tar ile birlikte kullanmaktır (çok sayıda argümanı işlemek için). Örneğin:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

4
Bu, tar'ın birden çok kez çağrılmasına neden olabilir ve ayrıca dosyaları tekrar tekrar paketleyecektir. Doğru:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen

Ben gerçekten sonuçların yükleri bulur, xargs bu sonuçları (yerel komut satırı bağımsız değişkenler sınırına dayalı) parçalar halinde bölmek ve her parça üzerinde tar çağırır çünkü kullanırken xargs, bir yerde tar rseçeneğini kullanmak gerektiğini bir yerde okudum . Bu , komut tarafından bulunan tüm sonuçları değil, döndürülen son tıklamayı içeren bir arşivle sonuçlanır . cfindxargsfind
Stphane

0

Olası gereksiz cevap ama yararlı bulduğumdan beri:

Bir FreeBSD kökü (yani csh kullanarak) tüm kök dosya sistemimi / mnt ama / usr ve (tabii ki) / mnt olmadan kopyalamak istedim. (Ben de) işte budur:

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

Bütün mesele, büyük dizinin bir kısmının kopyalandığı hariç tutulan dizinleri tar olarak belirtmek ( ./ ) koyarak gerekli olmasıdır .

Benim 0,02 €


0

Birkaç seviye derin 5 Gigabyte alt dizini dışlamak için katran alma şansım yoktu. Sonunda, sadece unix Zip komutunu kullandım. Benim için çok daha kolay çalıştı.

Bu nedenle, orijinal
gönderideki bu belirli örnek için (tar --exclude = '. / Klasör' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)

Eşdeğer:

zip -r /backup/filename.zip. -x yükleme / klasör / ** \ * yükleme / klasör2 / ** \ *

(NOT: Başlangıçta bana yardımcı olan yazı /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )


3
Dikkat: zipboş dizinleri paketlemez, ancak tar!
t0r0X

0

Bunu kontrol et

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

0

Localhost üzerinde yeni ön uç sürümü (açısal klasör) istiyorum. Ayrıca git klasörü benim durumumda çok büyük ve bunu hariç tutmak istiyorum. Uygulamayı çalıştırmak için sunucudan indirmem ve paketinden çıkarmam gerekiyor.

/ Var / lib / tomcat7 / webapps'deki açısal klasörü sıkıştırın, angular adıyla / tmp klasörüne taşıyın.

Komut:

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

0

Başarı Vaka: 1) yedekleme almak için tam yol veriyorsa, hariç olarak tam yol kullanılmalıdır.

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC

2) yedek almak için geçerli yol veriyorsanız, hariç tutmak da sadece geçerli yol kullanılmalıdır.

tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / günlük / ' ABC

Arıza Durumu:

  1. geçerli yol dizini yedek almak ve yoksaymak için tam yol vermek, o zaman işe yaramaz

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC

Not: yedekleme dizini öncesi / sonrası hariç tutmanın iyi olduğunu belirtmek.


0

Sürüm Kontrol Sistemi (VCS) dosyalarını hariç tutmaya çalışıyorsanız, tar zaten bu konuda iki ilginç seçeneği destekliyor! :)

  1. Seçenek: --exclude-vcs

Sürüm kontrol sistemleri takip ederek kullanılan bu seçenek hariç tutar dosya ve dizinleri: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, ve Darcs.

1.32 sürümünden itibaren aşağıdaki dosyalar hariç tutulmuştur:

  • CVS/ve altındaki her şey
  • RCS/ve altındaki her şey
  • SCCS/ve altındaki her şey
  • .git/ve altındaki her şey
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/ve altındaki her şey
  • .arch-ids/ve altındaki her şey
  • {arch}/ve altındaki her şey
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Seçenek: --exclude-vcs-ignores

Bazı sürüm kontrol sistemi (VCS) altındaki dizinleri arşivlerken, bu VCS'nin yoksayma dosyalarından (örn .cvsignore. .gitignore, Vb.) Hariç tutma kalıplarını okumak genellikle uygundur .

Bir dizin arşivleme önce, aşağıdaki dosyalardan herhangi birini içerip içermediğini: cvsignore, .gitignore, .bzrignore, veya .hgignore. Öyleyse, bu dosyalardan gelen kalıpları yoksayma bölümünü okuyun.

Modeller, karşılık gelen VCS'nin bunları tedavi edeceği kadar tedavi edilir, yani:

.cvsignore

Yalnızca bu dosyanın bulunduğu dizine uygulanan kabuk stili globbing desenleri içerir. Dosyada hiçbir yoruma izin verilmiyor. Boş satırlar yoksayılır.

.gitignore

Kabuk tarzı globbing desenleri içerir. Bulunan dizine .gitfileve tüm alt dizinlerine uygulanır.

A ile başlayan herhangi bir satır #bir yorumdur. Ters eğik çizgi yorum karakterinden kaçar.

.bzrignore

Kabuk globbing desenleri ve düzenli ifadeler içerir ( RE:(16) ile önekse desenler dizini ve tüm alt dizinlerini etkiler.

A ile başlayan herhangi bir satır #bir yorumdur.

.hgignore

Posix düzenli ifadeleri içerir (17). Hat syntax: globkabuk globbing desenlerine geçer. Hat syntax: regexpgeri döner. Yorumlar a ile başlar #. Desenler dizini ve tüm alt dizinlerini etkiler.

  1. Misal

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


-1

Aşağıdaki bash betiği hile yapmalıdır. Burada Marcus Sundman'ın verdiği cevabı kullanıyor .

#!/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

Bu, ihtiyacınız olan komutu yazdıracak ve kopyalayıp tekrar yapıştırabilirsiniz. Muhtemelen doğrudan komut satırına sağlamanın daha zarif bir yolu vardır.

Hariç tutmak istediğiniz diğer yaygın uzantılar, dosya adları veya normal ifadeler için * .CC'yi değiştirmeniz yeterlidir;

DÜZENLE

Sadece küçük bir açıklama eklemek için; find, seçilen normal ifadeyle eşleşen dosyaların bir listesini oluşturur (bu durumda * .CC). Bu liste xargs üzerinden echo komutuna iletilir. Bu yazdırılır - 'listeden bir giriş' ekleyin. Eğik çizgiler (), 'işaretleri için çıkış karakteridir.


1
Etkileşimli girdi istemek çoğu kabuk komut dosyası için zayıf bir tasarım seçeneğidir. Bunun yerine komut satırı parametrelerini okuyun ve kabuğun sekme tamamlama, geçmiş tamamlama, geçmiş düzenleme vb.
Avantajlarından yararlanın

1
Ayrıca, komut dosyanız boşluk veya kabuk metakarakterleri içeren yollar için çalışmaz. Kabuğun özellikle boşluk belirteçleri ve joker karakter genişletmesi gerçekleştirmesi gerekmedikçe, değişkenleri her zaman çift ​​tırnak içine almalısınız . Ayrıntılar için, bkz. Stackoverflow.com/questions/10067266/…
tripleee
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.