Katran arşivindeki bir dosyayı çıkarmadan görüntüleme


17

Katlanmış dosyanın içeriğini çıkarmadan görüntülemek istiyorum, Senaryo: Bir.tar var ve içinde bir dosya var ./x/y.txt. Ben y.txtaslında çıkarmadan içeriğini görüntülemek istiyorum a.tar.


Emacs kullanıyorsanız, içindeki tarball'ı açabilirsiniz.
Kudüs

Er, onu görmek için onu çıkarmalısın. Ne demek istediğini "bir dosyaya yazmadan"?
Toby Speight

Yanıtlar:


21

Muhtemelen GNU'ya özgü bir seçenektir, ancak dosyaları standart çıktıya çıkarmak için -Oveya--to-stdout

$ tar -axf file.tgz foo/bar -O

Ah çalışıyor, ama yeni satırlara çıktı basmayı başaramadım. ex; tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --Oörneğin, birçok dosya eşleştiğinde *read_this_file*. Her şey aynı satıra yazdırılır. Gönderen manbuldum --to-command. yani Passing --to-command="echo '' && cat"biraz kara büyü ama işe yarıyor: D
GabLeRoux

$ tar -axf file.tgz foo/bar -O
Cevapta

12

Bu, ./x/y.txt dosyasının içeriğini atar'dan STDOUT'a yazdırır.

tar xfO a.tar ./x/y.txt


2
ipucu: başkent "o", sıfır değil.
Hubert Grzeskowiak

4

Bu kadar basit

less  a.tar:./x/y.txt

Bu sihir numarası, lesspipeyüklediyseniz ve env değişkeni doğru olarak kuruluysa beklenen env değişkeni LESSOPENolarak tanımlanmışsa çalışır .| /usr/bin/lesspipe.sh %s


Bu harika bir senaryo - ama birden fazla var. Anladığım kadarıyla, bulesspipe.sh muhtemelen tercih edilmelidir.
mikeserv

Sıkıştırılmış tarballlarda işe yarayacak mı?
terdon

Olması gerekiyor. Ama ben sadece ubuntu'da işe yaramadı buldum. Git şekil. Özelliği kırmış veya kaldırmışlardır. Arşiv listesini daha az ama dosya içeriği olmayan olarak görüntüleyebilirsiniz:
solsTiCe

2

Oh, ama bu bir dosyadaki bir dosyanın içeriği hakkında bir soru tar. Ve aslında, bazı durumlarda bu o kadar zor değil. Mesele şu ki, bir tardosya sadece engellenmiş bir akış dosyasıdır - arşivdeki her dosya bir öncekinden sonra bulunur ve her dosya belirli bir biçime dayalı bir meta veri üstbilgisi alır .

Bu formata dayanarak, bir keresinde yazdım shitar- birkaç satır ddve kabuk komut dosyalarının taranında bir blok cihaz akışı oluşturabiliyordum. Aynı dayanarak, daha yakın zamanda bu birkaç kod satırını yazdım :

tar --no-recursion -c ./      |
{ printf \\0; tr -s \\0; }    |
cut -d '' -f-2,13             |
tr '\0\n' '\n\t'

... bir tardosyayı anında ayırmak ve bileşen metin dosyalarında satır içi dönüşümler yapmak için. Orada cutalanları alanlara işaret 1,2,13 bir NUL ait sınırlandırılmış hattını girişinin. Dosya yalnızca metin dosyaları içerdiğinde bu tür şeyler kolaydır , tarçünkü tarkayıt sınırlayıcıları (her 512 baytta bir kez olabileceği gibi) , olayları sizin gibi saymanıza gerek kalmadan yalnızca tek bir NUL'a sıkıştırılabilir ve sıyrılabilir.

tarbaşlık biçimi şuna benzer:

field    offset   len
name     0        100
mode     100      8
uid      108      8
gid      116      8
size     124      12
mtime    136      12
chksum   148      8
typeflag 156      1
linkname 157      100
magic    257      6
version  263      2
uname    265      32
gname    297      32
devmajor 329      8
devminor 337      8
prefix   345      155

Basit tarişlemlerin arşiv biçiminin çok daha karmaşık yönleriyle ele alınma kolaylığı arasında dik bir eğim olduğunu anlayın . Basit şeyler - homojen olarak yazılan küçük bir grup dosyayı birlikte paketlemek veya hatta yalnızca türlerini tahmin edebileceğiniz üyeleri içeren bir arşivi ayırmak gibi - birkaç kabuk borusuyla kolayca yapılabilir, ancak keyfi arşiv üyelerini güvenilir şekilde işlemek önemsiz bir mesele değildir.

Bu üyeler, herhangi bir güvenilir uygulamayı kesinlikle engelleyecek keyfi ikili veriler içerebildiğinde özellikle zordur tr -sve bu zorluk, yalnızca normal ve / veya yerel ayarlarınız dışındaki karakter kümeleri dışındaki çeşitli türlerde dosyalar kullanıldığında ve / veya orijinal arşiv, işlemeye hazır olmadığınız format uygulama tanımlarına sahip bir uygulama tarafından oluşturuldu. Ve bu sadece tararşiv türünün temel, standartlaşmış yönlerine dokunuyor - genişletilmiş başlıklar ve format uzantıları ve seyrek dosyalar ve sıkıştırma ekleyin ve ... bunlarla iyi şanslar.

Yine de, temel olarak, bir arşiv için standart kayıttar 20 blok veya 10240 bayttır. ustarBununla birlikte, standart kayıt boyutunda engellenen ve yalnızca standart dosya türleri ve standart üstbilgiler içeren bir arşiv göz önüne alındığında, aşağıdakilerle sizeeşleşen bir üye bulana kadar üstbilgi alanına göre okumalar yaparak üye başlığından üye başlığına atlamanız gerekir . aradığınız. Oraya vardığınızda, sizehedefinizin üye üstbilgisinin kuyruğundan başlayarak ofsetten gelen baytları okuyun . Ve bu senin dosyanız.

Ancak başlıkları atlamak son derece kolay değil. Farklı türlere karşılık gelen gerçek veri blokları eklenir veya eklenmez size. Örneğin, dizinler ve bağlantılar böyle bir veri bloğu içermez, yalnızca bir başlık açıklaması içerir; bu nedenle, sizealanının atlama formülünüze uygulanıp uygulanmayacağını kesin olarak belirlemeden önce geçerli üstbilginin dosya türünü doğrulamaya hazır olmanız gerekir .

Ayrıca, kayıt boyutu faktörleri - arşiv üyelerinin boyutlarının 10240 standart kayıt boyutu ile iyi senkronize olup olmamasına bağlı olarak, her birine ek bir 0 bloğu olabilir veya olmayabilir. Ve kayıt boyutu arşiv oluşturma zamanında bildirilebilir - ve bu yüzden 20 blok bile olmayabilir, ancak spesifikasyona göre, her zaman 512 baytlık birimlerde engellenmelidir:

  • Ustar
    • tarDeğişim formatı; bkz Detaylı Tanım bölümü. Karakter özel arşiv dosyaları için bu biçimin varsayılan blok boyutu 10240 olmalıdır . Uygulamalar, 512'nin katları olan 32256'ya eşit veya daha küçük tüm blok boyutu değerlerini destekleyecektir .

Dolayısıyla tar, rasgele ikili veriler içerebilecek dosyalar içerebilecek bir dosyayla çalışıyorsanız , dosyaya algoritmik olarak ve dosya türüne göre atlamanız gerekir. Spec diyor ki:

  • sizeAlan sekizli dosyanın boyutudur.
    • Eğer typeflagalan tipte bir dosya belirtmek için ayarlanır 1 (bir bağlantı ) veya 2'ye (bir sembolik bağlantı ) , sizetarla sıfır olarak belirtilecektir.
    • Eğer typeflagalan türü bir dosyayı belirtmek için ayarlanır 5 ( dizininde ) , sizebu kayıt türüyle tanımı altında açıklanan alan yorumlanır.
    • 1 , 2 veya 5 türleri için veri mantıksal kaydı saklanmaz .
    • Eğer typeflagalan ayarlanır 3 ( karakter özel dosyası) , 4 ( özel blok dosyası) ya da 6 ( FIFO ) , anlamı sizealanı POSIX.1-2008 bu hacim olarak belirtilmemiş olan ve herhangi bir veri mantıksal kayıtlar olacaktır ortamda saklanır.
    • Ayrıca, tip 6 için , sizeokuma sırasında alan göz ardı edilecektir.
  • Eğer typeflagalan başka bir değer ayarlanır, mantıksal kayıtların sayısı başlık olacaktır aşağıdaki yazılı bölünme sonucu bir kesri göz ardı.( (size+ 511 ) / 512 )

... ve elbette, her bir başlığın bireysel boyutunu da göz önünde bulundurarak - her üye için ek bir bloktur. Bu nedenle, aradığınız başlıkla eşleşen bir başlığa gelene kadar başlıktan başlığa okuma yoluyla atlayabilirsiniz, bu sırada geçerli kaydın yalnızca dosyanızın veya gerçek dosyanın bağlantısını açıklayıp tanımlamadığını kontrol etmeniz gerekir. . Bu özellikle önemlidir, çünkü aynı dosya arşive birden çok kez eklendiğinde birçok tars yalnızca bağlantı başlıkları içerecektir, çünkü gerçek dosya verileri zaten arşiv içinde başka bir yerde bulunabilir.

Hesaplamalarınızı chksumalana uygulamanız gerektiğini ve sahip olduğunuzu düşündüğünüz dosyayı aslında istediğiniz dosya olduğunu doğrulamanız gerekir. tar's chksumoldukça basit -

  • cksum
    • chksumBaşlık mantıksal kayıttaki tüm oktet basit toplamının sekizlik değer 1991 standart IRV temsili: Alan, ISO / IEC 646 olacaktır. Başlıktaki her sekizli imzasız bir değer olarak ele alınacaktır. Bu değerler, hassasiyeti 17 bit'ten az olmayan, sıfıra sıfırlanmış işaretsiz bir tam sayıya eklenecektir. Sağlama toplamı hesaplanırken, chksumalanın tamamı <boşluk> karakteri gibi kabul edilir.

Tabii ki, aslında bunlardan hiçbirini yapmak zorunda kalmayacaksınız , çünkü tarbunu zaten yapabilir - bu da öyle - ve muhtemelen sadece arşivi aramak ve dosyayı sizin için ayıklamak için kullanmalısınız. Bunu yaparken, ne hakkında olduğunuzu bildiğinizde yaptığınızdan çok farklı bir şey yapmayacaktır, ancak bunun muhtemelen daha iyi ve daha hızlı yapması gerekir, çünkü bu onun işi. Her neyse, neden yapasın ki?


0

Bu satırı kullanabilirsiniz

tar -axf a.tar -O

3
Bu, tar'da var olan herhangi bir dosyayı gösterecek, sadece y.txtdeğil ve OP'nin tar'daki tek dosya olduğu sorusundan belli değil.
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.