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.txt
aslında çıkarmadan içeriğini görüntülemek istiyorum a.tar
.
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.txt
aslında çıkarmadan içeriğini görüntülemek istiyorum a.tar
.
Yanıtlar:
Muhtemelen GNU'ya özgü bir seçenektir, ancak dosyaları standart çıktıya çıkarmak için -O
veya--to-stdout
$ tar -axf file.tgz foo/bar -O
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 man
buldum --to-command
. yani Passing --to-command="echo '' && cat"
biraz kara büyü ama işe yarıyor: D
$ tar -axf file.tgz foo/bar -O
Bu, ./x/y.txt dosyasının içeriğini atar'dan STDOUT'a yazdırır.
tar xfO a.tar ./x/y.txt
Bu kadar basit
less a.tar:./x/y.txt
Bu sihir numarası, lesspipe
yüklediyseniz ve env değişkeni doğru olarak kuruluysa beklenen env değişkeni LESSOPEN
olarak tanımlanmışsa çalışır .| /usr/bin/lesspipe.sh %s
lesspipe.sh
muhtemelen tercih edilmelidir.
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 tar
dosya 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 dd
ve kabuk komut dosyalarının tar
anı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 tar
dosyayı anında ayırmak ve bileşen metin dosyalarında satır içi dönüşümler yapmak için. Orada cut
alanları 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ü tar
kayı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.
tar
baş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 tar
iş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 -s
ve 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 tar
arş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. ustar
Bununla 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 size
eş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, size
hedefinizin ü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, size
alanı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:
tar
Değ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:
size
Alan sekizli dosyanın boyutudur.
typeflag
alan tipte bir dosya belirtmek için ayarlanır 1 (bir bağlantı ) veya 2'ye (bir sembolik bağlantı ) , size
tarla sıfır olarak belirtilecektir.typeflag
alan türü bir dosyayı belirtmek için ayarlanır 5 ( dizininde ) , size
bu kayıt türüyle tanımı altında açıklanan alan yorumlanır.typeflag
alan ayarlanır 3 ( karakter özel dosyası) , 4 ( özel blok dosyası) ya da 6 ( FIFO ) , anlamı size
alanı POSIX.1-2008 bu hacim olarak belirtilmemiş olan ve herhangi bir veri mantıksal kayıtlar olacaktır ortamda saklanır.size
okuma sırasında alan göz ardı edilecektir.typeflag
alan 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 tar
s 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ı chksum
alana 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 chksum
oldukça basit -
chksum
Baş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, chksum
alanın tamamı <boşluk> karakteri gibi kabul edilir.Tabii ki, aslında bunlardan hiçbirini yapmak zorunda kalmayacaksınız , çünkü tar
bunu 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?