tar: geçerli dizindeki tüm dosyaları ve dizinleri ekle .svn vb. DAHİL


91

Bir dizini tar.gz yapmaya çalışıyorum ve

tar -czf workspace.tar.gz *

Ortaya çıkan tar, alt .svndizinlerdeki dizinleri içerir , ancak geçerli dizinde DEĞİL (tar'a *geçmeden önce yalnızca 'görünür' dosyalara genişletilir)

Denedim

tar -czf workspace.tar.gz .bunun yerine ama sonra bir hata alıyorum çünkü '.' okurken değişti:

tar: ./workspace.tar.gz: file changed as we read it

*Bir dizindeki tüm dosyalarla (nokta önekli dahil) eşleşecek bir numara var mı ?

(Linux SLES-11 (2.6.27.19) üzerinde bash kullanarak


5
Belki bu soru süper kullanıcıya aittir?
Peter Jaric

Yanıtlar:


78

Tar dosyasını paketlediğiniz dizinde oluşturmayın:

tar -czf /tmp/workspace.tar.gz .

hile yapar, ancak paketi açtığınızda mevcut dizinin her yerine dosyaları çıkarır. Yapması daha iyi:

cd ..
tar -czf workspace.tar.gz workspace

veya içinde bulunduğunuz dizinin adını bilmiyorsanız:

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(Bu, bulunduğunuz yere ulaşmak için sembolik bağları takip etmediğinizi ve kabuğun bir sembolik bağ üzerinden geriye doğru atlayarak sizi ikinci kez tahmin etmeye çalışmadığını varsayar - bashbu açıdan güvenilir değildir. Bunun için endişelenmeniz gerekiyorsa, kullanmak cd -P ..fiziksel bir değişim dizini yapmak benim görünümünde varsayılan davranış değildir Aptal olduğunu -. en azından kimi için olanlar için, kafa karıştırıcı cd ... herhangi bir alternatif anlamı yoktu)


Tartışmadaki bir yorum şöyle diyor:

Ben [...] üst dizini dışarıda bırakmalıyım ve [...] tar'ı temel dizine yerleştirmem gerekiyor.

Yorumun ilk kısmı pek bir anlam ifade etmiyor - tar dosyası geçerli dizini içeriyorsa, bu arşivden dosya çıkardığınızda oluşturulmayacaktır çünkü tanım gereği mevcut dizin zaten mevcuttur (çok garip durumlar hariç ).

Yorumun ikinci kısmı iki yoldan biriyle ele alınabilir:

  1. Ya: dosyayı başka bir yerde oluşturun - /tmpolası bir konumdur - ve tamamlandıktan sonra orijinal konumuna geri taşıyın.
  2. Veya: GNU Tar kullanıyorsanız --exclude=workspace.tar.gzseçeneği kullanın. Ardından gelen dize =bir kalıptır - örnek en basit kalıptır - tam bir eşleşme. --exclude=./workspace.tar.gzÖnerilere aykırı olarak mevcut dizinde çalışıp çalışmadığınızı belirtmeniz gerekebilir ; --exclude=workspace/workspace.tar.gzönerildiği gibi bir seviye üzerinde çalışıp çalışmadığınızı belirtmeniz gerekebilir . Hariç tutulacak birden fazla tar dosyanız varsa, ' *' kullanın --exclude=./*.gz.

1
Güzel cevap ama bu komutu paketlenmesi gereken dizinde çalıştırmak zorunda kaldığım bir durum var. Dışarıda çalıştırmak için yeterli iznim yok.
Hexodus

Kesinlikle paketlemek için mükemmel bir yer / tmp'dir.
Andre Fellows

46

Eğer varsa gerçekten tarball üst dizin dahil etmek istemiyoruz (ve bu kötü bir fikir genellikle var):

tar czf workspace.tar.gz -C /path/to/workspace .

Üst dizini dışlamam gerekiyor ve tar'ı temel dizine yerleştirmem gerekiyor.
Micha

@Micha, daha sonra dosyayı arşivlemek ve kopyalamak için bir bash betiği
hazırlar

2
Sanırım - in -czf'yi kaçırıyorsun.
UpTheCreek

10
man tar: tar için ilk argüman bir işlev olmalıdır; ya harflerden Acdrtuxbiri ya da uzun işlev isimlerinden biri. Bir işlev harfinin önüne geçilmesine gerek yoktur- ve diğer tek harfli seçeneklerle birleştirilebilir.
rkhayrov

4
Hala çalışmıyor, bende hala "." tarball'umda üst dizin olarak
A.Gille

44

Atmanız gereken birkaç adım var:

  1. Değiştir *tarafından .hem gizli dosyaları dahil etmek.
  2. Arşivi aynı dizinde oluşturmak için --exclude=workspace.tar.gz, arşivin kendisini dışarıda bırakmak için bir kullanılabilir.
  3. tar: .: file changed as we read itArşiv henüz oluşturulmadığında hatayı önlemek için , var olduğundan emin olun (örneğin kullanarak touch), böylece --exclude arşiv dosya adıyla eşleşir. (Dosya yok onunla eşleşmiyor)

Bu sonuç aşağıdaki komut dosyasında birleştirildi:

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

7
Tüm cevapları ve yorumları okudum ve bu aynı dizinde tarball oluşturmanın en güzel yolu. Bu cevaptan bu hatanın neden olduğunu da anladım.
Szymon Sadło

Eğer bu sizin tar dosyasını sıkıştırarak esnada ilerleme görmek istiyorsanız, için ek bir bayrak ekleyebilir --verbose, şöyle: -czvf.
Mastrianni

19

dizinde sıkıştırmak istiyorum (mevcut dizin) şunu deneyin:

tar -czf workspace.tar.gz . --exclude=./*.gz

2
Ama şimdi "." Dosyasından şikayet ediyor. okunurken değişti. Tüm dosyaların dahil edildiğinden emin olabilir miyim?
Jaan

1
Bu .gz, dizindeki tüm dosyaları hariç tutar .
omerfarukdogan

12

Bir dizine geri dönüp şunu yaparak gizli dizinleri dahil edebilirsiniz:

cd ..
tar czf workspace.tar.gz workspace

Gzip yapmak istediğiniz dizinin çalışma alanı olduğunu varsayarsak.


Bu, değişen dosya sorununu da ortadan kaldırır.
Jonathan Leffler

Kullanıcının üst klasörde yazma izni olmadığında çalışmaz.
Joachim Wagner

Kesinlikle @JoachimWagner!
p01ymath

1
@Filmdenkare Yazma izniniz yoksa şu şekilde değiştirin:tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
bramp

1
Çalışması için -önce çıkarmak zorunda kaldım czf. Aksi takdirde Cannot stat: No such file or directoryhata mesajı alıyordum .
Phemelo Khetho

6

.Formu şu şekilde düzeltebilirsiniz --exclude:

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

5

Güncelleme: OP'nin yorumu için bir düzeltme ekledim.

tar -czf workspace.tar.gz .

gerçekten de geçerli dizini değiştirecek, ama neden dosyayı başka bir yere yerleştirmiyorsunuz?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update

Dosya daha sonra işlenecek ve çalışma alanında olması gerekiyor - biraz çirkin ama sadece gerekli (her şey sadece bir geçici çözüm ...)
Micha

Tamam, bunun için bir düzeltme ekleyeceğim :)
Peter Jaric

Ve bunu tekrar tekrar çalıştırabilmeniz gerekiyorsa, tar satırının önüne 'rm workspace.tar.gz' ekleyin.
Peter Jaric

Eğer, bütün bir sürücü katran istiyorsanız içine aynı sürücüye, birçok seçenek yok gibi görünüyor.
BeeOnRope

4

Aslında sorun sıkıştırma seçenekleriyle ilgili. İşin püf noktası, yerleşik seçenekleri kullanmak yerine katran sonucunu bir kompresöre yönlendirmektir. Bu arada, ekstra sıkıştırma seçenekleri ayarlayabildiğiniz için bu size daha iyi sıkıştırma sağlayabilir.

Minimum katran:

tar --exclude=*.tar* -cf workspace.tar .

Seçtiğiniz bir kompresöre boru verin. Bu örnek ayrıntılıdır ve maksimum sıkıştırmayla xz kullanır:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

Çözüm Ubuntu 14.04 ve Cygwin'de Windows 7'de test edildi. Bu bir topluluk wiki yanıtıdır, bu nedenle bir hata görürseniz düzenlemekten çekinmeyin.


Teşekkür ederim! Save ma life
Steven

2

Burada sunulan çözümlerin çoğuyla ilgili sorun, katranın ./her girişin başında içermesidir . Bu ., GUI sıkıştırıcı aracılığıyla açarken dizine sahip olmakla sonuçlanır . Yani sonunda yaptığım şey:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

Zaten my.tar.gzmevcut dizinde varsa, bunu açıklamak isteyebilirsiniz:

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

Farkında olun o Xargs belli sınırı (bkz sahiptir xargs --show-limits). Bu nedenle, taramaya çalıştığınız bir dizinde çok sayıda giriş (dizinler ve dosyalar) içeren bir paket oluşturmaya çalışıyorsanız, bu çözüm işe yaramayacaktır.


1

Güzel bir soru. (D)ZSH'de "dotfiles" anlamına gelen globbing değiştiricisini kullanabilirsiniz . Karşılaştırmak:

ls $HOME/*

ve

ls $HOME/*(D)

Bu, özel telefon rehberi girişlerini .ve ... Bash'de .*nokta dosyalarını açıkça dahil etmek için kullanabilirsiniz :

ls $HOME/* $HOME/.*

Ama buna .ve ..aynı zamanda dahildir , bu yüzden aradığınız şey bu değil. Eminim ki *bash'da da eşleştirme dotfiles yapmanın bir yolu vardır .


Bash'de, ve .??*değil tüm nokta dosyalarını eşleştirmek için kullanın . Bu, tek karakterli nokta dosyaları (gibi ) almaz . Bunları da elde etmek için daha karmaşık olanı kullanın . ....a.[^.]*
Scott Minster

1

Klasördeki öğe sayısının çok büyük olmadığını varsayarsak başka bir çözüm:

tar -czf workspace.tar.gz `ls -A`

( ls -Anormal ve gizli dosyaları yazdırır, ancak "." ve ".." dosyalarını yazdırmaz ls -a.)


0
tar -czf workspace.tar.gz .??* *

Belirtmek .??*, "nokta" dosyalarını ve noktadan sonra en az 2 karakter olan dizinleri içerecektir. Olumsuz tarafı, örneğin .avarsa , noktadan sonra tek bir karakter içeren dosyaları / dizinleri içermeyecek olmasıdır .


0

Disk alanı bir sorun değilse, bu aynı zamanda yapılması çok kolay bir şey olabilir:

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup

0

Ben de benzer bir durum yaşadım. Bence en iyisi tar'ı başka bir yerde oluşturmak ve sonra tar'a sıkıştırılmış dosyalar için temel dizini söylemek için -C'yi kullanmaktır. Misal:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

Bu şekilde kendi tar dosyanızı dışarıda bırakmanıza gerek kalmaz. Diğer yorumlarda belirtildiği gibi, -A gizli dosyaları listeler.


0

10 yıl sonra, tarGit 2.30 (Q1 2021) ile gösterilen, tar yerine serbest bırakılan tarball'ı üretmek için " git archive" ( man ) kullanan bir alternatifiniz var .
(Bu alternatifi uygulamak için Git 2.30'a ihtiyacınız yok)

Bkz 4813277 taahhüt (2020 11 Eki) ve 93e7031 taahhüt tarafından (10 Eki 2020) René Scharfe ( rscharfe) .
(Tarafından Birleştirilmiş - Junio C Hamano gitster- içinde 63e5273 taahhüt 2020 27 Eki)

Makefile: dist-doc için git init / add / commit / archive kullanın

İmza: René Scharfe

HTML dokümantasyonu için dağıtım arşivleri oluşturarak harici araçlara bağımlılığı azaltın ve sayfaları tar yerine ( man ) komutlarını kullanarak yönetin . Bu, arşiv girişlerine ikili dosyalar için dist arşivindekilerle aynı meta verileri verir.git

Yani bunun yerine:

tar cf ../archive.tar .

Yalnızca Git kullanarak yapabilirsiniz:

git -C workspace init
git -C workspace add .
git -C workspace commit -m workspace
git -C workspace archive --format=tar --prefix=./ HEAD^{tree} > workspace.tar
rm -Rf workspace/.git

Bu, başlangıçta önerildi, çünkü burada açıklandığı gibi , bazı egzotik platformlar, seçenekleri olmayan eski bir katran dağılımına sahip olabilir.


-1

Kullanmak findmuhtemelen en kolay yoldur:

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+

find . -maxdepth 1geçerli dizindeki tüm dosyaları / dizinleri / symlinks / etc'yi bulur ve ile belirtilen komutu çalıştırır -exec. {}Komut vasıtaları içinde dosya listesinde buraya ve \+komut şeklinde geçer demekse:

tar zcvf workspace.tar.gz .file1 .file2 .dir3

onun yerine

tar zcvf workspace.tar.gz .file1
tar zcvf workspace.tar.gz .file2
tar zcvf workspace.tar.gz .dir3

-J, kılavuzda --xz'dir; -c ile birlikte bir bilgisayarın "eğlence" olarak adlandıracağı şeyin sadece başlangıcıdır :)
Ricalsin

Haha, evdeki mini sunucum CPU'dan çok disk alanıyla sınırlı :) Yine de iyi bir nokta; Gzip kullanmak için değiştireceğim.
Andrew Gunnerson
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.