Katran arşivinden dosyaları kaldırma


18

Çok foo.tar.xzsayıda (200000) dosya içeren büyük bir dosya var. Bu arşivin istemediğim bazı (yaklaşık 5000) dosya içerdiğini anladım. Her şeyi diskime açmak için yeterli disk alanım yok; ayrıca, eğer yaparsam, niteliklerin / hakların kaybolabileceğinden korkuyorum. Sıkıştırılmış arşivin iki kopyasını barındırmak için yeterli alanım var . Anında, yani arşivi tek tek dosyalara açmadan, bazı dosyaları arşivden (dosya adında bir regex ile belirtilir) kaldırmak için bir araç var mı?

Yanıtlar:


17

GNU tar, --deletegünümüzde de arşivlerle çalışan bir seçeneğe sahiptir.

Bu şekilde kullanın, örneğin:

tar -vf yourArchive.tar --delete your/path/to/delete

Dikkat: Büyük ihtimalle olacak değil manyetik teyp ortamı her türlü çalışır. Ancak tar, bir boruda çalışırken herhangi bir sorun yaşamaz, bu nedenle geçici bir katran dosyası kullanabilir ve daha sonra kasetin üzerine yazabilirsiniz. Sıkıştırılmış dosyalar üzerinde de çalışmaz, bu nedenle dosyayı açmanız gerekir.

Ayrıca, katran arşivlerinin (tasarım gereği) paketlenmiş doğrusal doğası nedeniyle işlem her durumda oldukça yavaş olacaktır.


1
Var, ancak rasgele erişimin mümkün olmadığı dosyalar ile çalışmıyor (örneğin, arşivleri sıkıştır), ancak bu benim kullanım durumum.
FUZxxl

1
Diğer sorun, silinecek bir desen belirleyemem. Zaten eksikliklerini giderdiğim 2013'teki yorumuma dikkat edin gtar --delete.
FUZxxl

4
@FUZxxl -Tile çalışır --deleteve --wildcardsbunu desenleri ve kullanımını içeren geçici bir dosya oluşturmak, dosya adları yerine desenleri kullanmasını sağlar unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Tam bir regex yapmaz (buna ihtiyacınız varsa, tar -tsilmek için bir dosya adları listesi kullanın ve oluşturun), sadece dosya adı eşleşen desenleri.
Random832

14

(o zamandan beri de düzenlenmiş olan soruyu yanlış anladığım için düzenlendi)

Yapabileceğiniz en iyi şey tüm dosyayı ayıklamak, silmek ve yeniden sıkıştırmaktır.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Bir tar'dan dosyaları doğrudan silmek mümkün değildir.

tar, başlangıçta rasgele arama yapamayan teyp sürücüleri için tasarlanmış bir akıştır - teorik olarak, bir disk dosya sisteminde bir delik açmak / kalan dosyayı yeniden yazmak mümkün olabilir, sıkıştırma ile nokta, hepsi değilse bile en çok tartışmalıdır. sıkıştırma yöntemleri büyük ölçüde dosyada daha önce meydana gelen içeriklere bağlıdır. Bunu yapmak için hem sıkıştırma yöntemi hem de tar dosyası biçimi hakkında çok ayrıntılı bilgiye ihtiyacınız olacaktır. Bu hiç kimsenin rahatsız etmeyeceği bir noktaya kadar karmaşıklıktır. Dosyaları saklamak ve görmezden gelmek daha ucuzdur.

Bu işlevselliğe ihtiyacınız varsa, katran muhtemelen istediğiniz şey değildir.


Bu dosyalar arşiv boyutunun% 35'ini oluşturur. Belirttiğiniz kısıtlamalar, yalnızca dosyayı yeniden yazdığımda geçerlidir, eğer yerine koyabileceğim şekilde değiştirmezsem, yapabilirim ( paketlenmiş arşivi iki kez kaydetmek için yeterli alanım var ). Böyle bir araç var mı?
FUZxxl

O zaman sorunuzu yanlış anlamış olabilirim. Her şeyden önce katranı paketinden çıkarmaya ve yeniden paketlemeye istekli iseniz (sadece katranlanmış dosyaları oluşturmadan - yani katran borusuna doğrudan katran), bu mümkün olabilir.
frostschutz

Evet, yapabilirim. Sadece dosyaların korumam gereken uids / gids / öznitelikleri var. Ayrıca, açılmamış gösterimi kaydetmek için yeterli disk alanım yok. İki paketlenmiş arşivi kurtarmak için yeterli alanım var.
FUZxxl

1
Hiç sorun değil. Bunu tek geçişte yapabilirsem, zaman çok uzun olmayacak. Aslında depolama alanı serbest bırakılırken hızlı delege sağlayan herhangi bir arşiv biçimi hayal edemiyorum.
FUZxxl

1
--wildcardsyardım ... ./
Gert van den Berg

-4

El kitabına göre , tarsadece bunları ayıklamak için bir dosya adları listesi iletebilirsiniz . Örneğin:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

--Extract'ın bana nasıl yardımcı olduğunu görmüyorum. Açıklayabilir misiniz? Lütfen arşivi (veya önemli bölümlerini) diske açamadığımı unutmayın.
FUZxxl

2
Lütfen sadece bağlantı göndermeyin: bu bir wiki - insanların cevabınızı anlaması için sayfadan ayrılması için gereksiz olması için yeterli içerik ekleyin.
jasonwryan
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.