Mevcut bir tar.gz arşivine dosya ekleme / güncelleme?


73

Bir tar.gz arşivine dosya eklemenin / güncellemenin bir yolu var mı? Temelde, bir dosya içeren bir arşivim var /data/data/com.myapp.backup/./files/settings.txtve bu dosyayı arşivden çekmek istiyorum (zaten yapıldı) ve düzenleme yapıldıktan sonra onu tekrar arşive itmek istiyorum. Bunu nasıl başarabilirim? Yoldaki giriş yüzünden sorunlu .mu?


2
+1. Bu OS X üzerinde çalışmayı çok kolaylaştıracaktır. Şu anda, tüm gizli dosyaların bir dizinini el ile temizlemeliyim .DS_Storeve sonra dizini yeniden tartarım.

Yanıtlar:


15

Tar dosyası formatı sadece birkaç başlıkla birleştirilmiş bir seri dosyadır. Parçalamak, içeriğinizi koymak ve bir araya getirmek çok karmaşık bir iş değil. Söyleniyor, Jander tarif nasıl katran bir program bunu yapmak için fayda fonksiyonlarını yoktur ve sahip sıkıştırma ile ek zorluklar vardır diye önce ve bir değişikliği yaptıktan sonra hem.

Ancak, iş için araçlar var! Sıkıştırılmış bir tar arşivinin bir geri döngü montajını bir klasöre yapmanıza izin verecek en az iki sistem var, ardından dosya sisteminde değişikliklerinizi yapın. İşiniz bittiğinde, klasörü çıkarın ve sıkıştırılmış arşiviniz çalışmaya hazırdır.

İlk seçenek, FUSE için archivemount projesi olacaktı . İşte bu konuda bir öğretici . Sisteminizde muhtemelen zaten SİGORTA var ve dağıtımınız yoksa, bunun için bir seçenek olmalıdır.

Diğer seçenek ise tarfs . Bu var kullanımı daha kolay , ama oldukça iyice öncelikle bu test edebilir böylece bozulmasını bzip2 arşivleri ile bazı sorunlar vardır duydum.


1
Ubuntu ve Debian'da paketlenmiş AVFS kullanıyorum . Archivemount ve tarfs'in AVFS ile karşılaştırıldığını biliyor musunuz?
Gilles

Dürüst olmak gerekirse hayır, şu anda alternatiflerden bahsettiğiniz AVFS'ye bakmayı merak ediyorum. Hem archivemount hem de tarf kullandım, ancak uzun süredir kullanılmayan bir projeydi ve şu anki durumlarını bilmiyor. Bu tecrübeden, uygulamanın kusursuz çalışmasına rağmen fikrin kavramsal olarak yanlış olduğuna karar verdim.
Caleb

Archivemount'un nasıl çalıştığına baktım. Mevcut .tar.gz dosyasını değiştirmez, ancak bağlantısını açtığınızda orijinali yeniden adlandırır ve yerine yeni bir tar dosyası oluşturur. İyi bir kullanıcı deneyimi arıyorsanız, bu harika, ancak verimlilik nedeniyle tüm arşivin yeniden yazılmasını önlemek istiyorsanız bu size yardımcı olmaz.
Jander

@Jander Bunu işaret ettiğin için. Sıkıştırılmış arşiv montaj seçeneklerine de uygulandığından eminim. Sorun, dosyanın tek tek bölümlerinin sıkıştırılmaması, genel iç dosya üstbilgilerinin ve hepsinin sıkıştırılması ve başka bir şeyin çıkarılması için beklendiği gibi gzip'in tüm veri kümesinde çalıştırılması gerektiğidir . Bunun ortasındaki bir şeyi, ayıklamadan ve sıkıştırmayı yeniden başlatmadan ve tüm veri dosyasını yeniden yazmadan enjekte etmenin bir yolu yoktur. Dolayısıyla benim önceki yorumum kavramsal olarak yanlış bir çözümdür . Arşivler arşivdir.
Caleb

43

Dosyanızı arşivinizden çekmek için kullanabilirsiniz tar xzf archive.tar.gz my/path/to/file.txt. Dosyanın yolundaki dizinlerin de oluşturulacağını unutmayın. Arşivdeki dosyaları listelemek için tar t(ie tar tzf archive.tar.gz) kullanın .

tardosyaların "yerinde" güncellenmesini desteklemiyor. Ancak, zaten arşivdeki bir dosyayla aynı yola sahip olsalar bile, arşivin sonuna dosya ekleyebilirsiniz. Bu durumda, dosyanın her iki kopyası da arşivde olacak ve daha sonra eklenen dosya önceki dosyayı geçersiz kılacaktır. Bunun için kullanılacak komut tar r(ya tar uda yalnızca arşivden daha yeni dosyaları eklemek) kullanılacak komuttur. .Yolunda bir problem olmamalı.

Yine de bir yakalama var: sıkıştırılmış bir arşive eklenemezsiniz. Yani yapmanız gereken:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Muhtemelen duymak istediğin şey değildir, çünkü tüm arşivin iki kez yeniden yazılması anlamına gelir. Çok büyük bir arşiv değilse, her şeyi kaldır ve sonra düzenlemeyi yaptıktan sonra yeniden tar katmak daha iyi olabilir. Alternatif olarak, sıkıştırılmamış bir arşiv kullanabilirsiniz.


Bu cevap sadece standart tarprogramla ilgilendiği sürece doğrudur . Bir dosya formatı olarak Tar aslında çok erişilebilir. İçeriği kendiniz güncellemek için kolayca bir komut dosyası yazabilirsiniz, ancak bunu zaten yapan başka araçlar da vardır .
Caleb

23
Bunu Unix yolunda da yapabilirsiniz:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter

2
IIRC, sadece iki gzip'lenmiş dosyayı birleştirebilirsiniz. Sonuç, birleştirilmiş her iki sıkıştırılmamış dosyayı içeren daha büyük bir gzip'ed dosyasıdır.
FUZxxl

Dosya açıldıktan sonra --update bayrağı kullanılamaz mı?
pietro

Gzip birleştirme işleminden bahseden @ FUZxxl +1
Johan

9

Tar asıl olarak kasetler için kullanılmıştı, bu yüzden dosyaları "değiştirmek" aslında tasarımda değil. Ancak, dosyayı asıl tar'dan silmek için --delete komutunu, ardından tar'ı güncellemek ve dosyayı yeniden eklemek için -u komutunu kullanabilirsiniz. Tar'in arşivi dahili olarak yeniden düzenlemesi gerektiğinden biraz zaman alabilir.


StackExchange'e Hoş Geldiniz! Cevabınız yalnızca başka bir cevapta daha önce yapılmış bir öneri içeriyor . Tekrarlamadan önce, çoğaltmaktan kaçınmak için lütfen bir soruya verilen diğer cevapları okuyun.
JigglyNaga

1
Cevabımı biraz düzenledim. Diğer cevap --delete bahseder sanmıyorum
rleibman

-5

Linux x86_64 GNU / Linux'umda bu işlemi gerçekleştirmek için aşağıdaki komutu kullanıyorum:

tar cvfpz /path/archive.tar -T list.txt

Bu komut /path, dosyaya dahil edilmiş bir list.txtdosya listesi kullanılarak sıkıştırılmış bir arşiv oluşturulmasına neden olur .


6
Bu /path/archive.tar, o dosyayı eklemek / güncellemek yerine varolan bir dosyanın üzerine yazar .
Anthon
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.