Saya ingin melihat konten file tar tanpa mengekstraknya, Skenario: Saya punya a.tar dan di dalamnya ada file bernama ./x/y.txt
. Saya ingin melihat konten y.txt
tanpa benar-benar mengekstraksi a.tar
.
Saya ingin melihat konten file tar tanpa mengekstraknya, Skenario: Saya punya a.tar dan di dalamnya ada file bernama ./x/y.txt
. Saya ingin melihat konten y.txt
tanpa benar-benar mengekstraksi a.tar
.
Jawaban:
Ini mungkin opsi khusus GNU, tetapi Anda bisa menggunakan -O
atau --to-stdout
untuk mengekstrak file ke output standar
$ tar -axf file.tgz foo/bar -O
tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --O
ketika misalnya, banyak file cocok *read_this_file*
. Semuanya dicetak pada baris yang sama. Dari man
, saya menemukan --to-command
. jadi Passing --to-command="echo '' && cat"
adalah sedikit sihir hitam tetapi berhasil: D
$ tar -axf file.tgz foo/bar -O
Ini mencetak konten ./x/y.txt dari a.tar ke STDOUT.
tar xfO a.tar ./x/y.txt
Ini sederhana seperti
less a.tar:./x/y.txt
Trik sulap ini berfungsi jika Anda telah lesspipe
menginstal dan jika variabel env LESSOPEN
didefinisikan sebagai | /usr/bin/lesspipe.sh %s
yang diharapkan jika Anda memiliki lesspipe yang diinstal dengan benar.
lesspipe.sh
mungkin harus lebih disukai.
Oh, tapi ini pertanyaan tentang isi file di dalam tar
file. Dan sebenarnya, dalam beberapa kasus ini tidak terlalu sulit. Masalahnya, tar
file hanyalah file stream yang diblokir - setiap file dalam arsip ditemukan setelah yang sebelumnya, dan setiap file mendapatkan header metadata berdasarkan format yang ditentukan .
Berdasarkan format itu, saya pernah menulis shitar
- yang merupakan beberapa baris dd
dan skrip shell yang dapat tar
meningkatkan aliran perangkat blok dengan cepat. Berdasarkan hal yang sama, baru-baru ini saya menulis beberapa baris kode berikut :
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t'
... untuk memisahkan tar
file dengan cepat dan melakukan transformasi sebaris pada file teks komponennya. Di sana, cut
bidang menunjuk ke bidang 1,2,13 dari jalur input terbatas NUL . Hal-hal seperti itu mudah ketika tar
file hanya berisi file teks karena tar
pembatas rekaman (seperti yang mungkin terjadi setiap 512 byte) hanya dapat diperas menjadi NUL tunggal per dan dilepas - tanpa mengharuskan Anda untuk menghitung kejadian seperti yang Anda lakukan.
tar
Format tajuk terlihat seperti ini:
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
Memahami bahwa ada kemiringan yang curam antara kemudahan relatif dalam menangani tar
operasi sederhana dengan aspek format arsip yang jauh lebih rumit. Sementara hal-hal sederhana - seperti mengemas sekelompok kecil file yang diketik secara homogen bersama-sama atau bahkan membagi arsip yang hanya berisi anggota yang tipenya dapat Anda prediksi - dapat dengan mudah dilakukan dengan beberapa pipa shell, andal menangani anggota arsip yang sewenang-wenang bukanlah masalah yang sepele.
Terutama sulit ketika anggota tersebut mungkin berisi data biner sewenang-wenang - yang tentu saja akan menghalangi aplikasi yang andal tr -s
- dan kesulitan ini hanya bertambah ketika file dari berbagai jenis selain reguler dan / atau rangkaian karakter selain yang asli Anda digunakan dan / atau arsip asli dibuat oleh implementasi dengan kekhasan format aplikasi yang tidak siap Anda tangani. Dan ini hanya menyentuh pada dasar, aspek standar dari tar
tipe arsip - tambahkan header yang diperluas dan ekstensi format dan file jarang dan kompresi dan ... well, semoga sukses dengan itu.
Kembali ke dasar, meskipun, standar record -ukuran untuk tar
arsip adalah 20 blok - atau 10.240 bytes. Mengingat arsip diblokir pada ukuran catatan standar dan hanya berisi jenis file standar dan ustar
header standar , Anda harus melompat dari header anggota ke header anggota dengan melakukan pembacaan sesuai dengan size
bidang header sampai Anda menemukan anggota yang cocok dengan yang untuk yang Anda cari. Sesampai di sana, baca dalam size
byte dari offset dimulai di ujung header anggota target Anda. Dan itu file Anda.
Melompati header tidaklah mudah. Tipe yang berbeda baik akan atau tidak akan memiliki blok data aktual yang sesuai dengan size
. Misalnya, direktori dan tautan tidak akan berisi blok data seperti itu, hanya uraian tajuk, dan karenanya Anda harus siap untuk memverifikasi jenis berkas tajuk saat ini sebelum memastikan dengan tepat apakah Anda harus menerapkan size
bidangnya ke rumus lompatan Anda atau tidak.
Juga, catatan faktor-ukuran - tergantung pada apakah atau tidak ukuran arsip-anggota sync dengan baik dengan 10240 standar record -ukuran mungkin atau mungkin tidak menjadi tambahan 0-blok ditambahkan ke masing-masing. Dan ukuran record dapat dideklarasikan pada waktu pembuatan arsip - dan karenanya bahkan mungkin tidak menjadi 20 blok sama sekali, meskipun, secara spesifik, itu harus selalu diblokir pada unit 512-byte:
tar
interchange Format; lihat bagian DESKRIPSI PERPANJANG . Blocksize default untuk format ini untuk file arsip khusus karakter adalah 10240 . Implementasi harus mendukung semua nilai bloksize kurang dari atau sama dengan 32256 yang merupakan kelipatan 512 .Jadi jika Anda bekerja dengan tar
file yang mungkin berisi file yang mungkin berisi data biner sewenang-wenang Anda harus melewati file secara algoritmik, dan sesuai dengan tipe file. Spesifikasi mengatakan:
size
lapangan adalah ukuran file dalam oktet.
typeflag
bidang diatur untuk menentukan file dengan tipe 1 ( tautan ) atau 2 ( tautan simbolik ) , size
bidang tersebut harus ditentukan sebagai nol.typeflag
bidang diatur untuk menentukan file tipe 5 ( direktori ) , size
bidang tersebut harus ditafsirkan sebagaimana dijelaskan di bawah definisi tipe catatan itu.typeflag
bidang diatur ke 3 ( file karakter khusus ) , 4 ( blok file khusus ) , atau 6 ( FIFO ) , arti dari size
bidang tersebut tidak ditentukan oleh volume POSIX.1-2008 ini, dan tidak ada catatan logis data yang harus dibuat. disimpan di media.size
bidang harus diabaikan saat membaca.typeflag
bidang diatur ke nilai lain, jumlah catatan logis yang ditulis setelah header harus , mengabaikan fraksi apa pun dalam hasil pembagian.( (
size
+ 511 ) / 512 )
... dan, tentu saja, mempertimbangkan juga ukuran masing-masing header - yang merupakan blok tambahan per anggota. Jadi, Anda dapat melewati membaca dengan membaca dari header ke header sampai Anda menemukan satu yang cocok dengan header yang Anda cari, pada saat itu Anda kemudian perlu memeriksa apakah catatan saat ini hanya menggambarkan tautan ke file Anda atau ke file yang sebenarnya . Ini sangat relevan karena ketika file yang sama ditambahkan ke arsip beberapa kali banyak tar
s hanya akan menyertakan header tautan karena data file yang sebenarnya sudah dapat ditemukan di tempat lain dalam arsip.
Setelah memverifikasi bahwa Anda harus menerapkan perhitungan Anda ke chksum
bidang dan memverifikasi file yang menurut Anda sebenarnya adalah file yang Anda inginkan. tar
's chksum
cukup sederhana meskipun-:
chksum
lapangan akan menjadi ISO / IEC 646: 1991 standar Irv representasi dari nilai oktal dari jumlah sederhana dari semua oktet dalam catatan logis sundulan. Setiap oktet di header harus diperlakukan sebagai nilai yang tidak ditandatangani. Nilai-nilai ini harus ditambahkan ke bilangan bulat bertanda, diinisialisasi ke nol, ketepatan yang tidak kurang dari 17 bit. Saat menghitung checksum, chksum
bidang diperlakukan seolah-olah semuanya <spasi> karakter.Tentu saja, Anda sebenarnya tidak perlu melakukan itu, karena tar
sudah bisa melakukan itu - itu yang dilakukannya - dan Anda mungkin harus menggunakannya untuk mencari arsip dan mengekstrak file untuk Anda. Dengan melakukan itu tidak akan melakukan sesuatu yang sangat berbeda dari yang akan Anda lakukan jika Anda tahu apa yang Anda tentang, kecuali bahwa itu mungkin akan melakukannya lebih baik dan lebih cepat karena itu tugasnya. Lagi pula, mengapa Anda harus?