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
.
shell-script
tar
archive
Ramji
sumber
sumber
Jawaban:
Ini mungkin opsi khusus GNU, tetapi Anda bisa menggunakan
-O
atau--to-stdout
untuk mengekstrak file ke output standarsumber
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. Dariman
, 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
sumber
Ini sederhana seperti
Trik sulap ini berfungsi jika Anda telah
lesspipe
menginstal dan jika variabel envLESSOPEN
didefinisikan sebagai| /usr/bin/lesspipe.sh %s
yang diharapkan jika Anda memiliki lesspipe yang diinstal dengan benar.sumber
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 barisdd
dan skrip shell yang dapattar
meningkatkan aliran perangkat blok dengan cepat. Berdasarkan hal yang sama, baru-baru ini saya menulis beberapa baris kode berikut :... 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 ketikatar
file hanya berisi file teks karenatar
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: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 daritar
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 danustar
header standar , Anda harus melompat dari header anggota ke header anggota dengan melakukan pembacaan sesuai dengansize
bidang header sampai Anda menemukan anggota yang cocok dengan yang untuk yang Anda cari. Sesampai di sana, baca dalamsize
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 menerapkansize
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 darisize
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
'schksum
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?sumber
Anda dapat menggunakan baris ini
sumber
y.txt
dan tidak jelas dari pertanyaan OP bahwa itu adalah satu-satunya file di tar.