Lihat file dalam arsip tar tanpa mengekstraksinya

16

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.txttanpa benar-benar mengekstraksi a.tar.

Ramji
sumber
Jika Anda menggunakan Emacs, Anda cukup membuka tarball di dalamnya.
Qudit
Eh, untuk melihatnya, Anda harus mengekstraknya. Saya kira yang Anda maksud adalah "tanpa menulis ke file"?
Toby Speight

Jawaban:

20

Ini mungkin opsi khusus GNU, tetapi Anda bisa menggunakan -Oatau --to-stdoutuntuk mengekstrak file ke output standar

$ tar -axf file.tgz foo/bar -O
fredtantini
sumber
Ah berhasil, tapi saya tidak berhasil mencetak output pada baris baru. ex; tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --Oketika 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
GabLeRoux
Hanya ini diperlukan sebagai jawaban:$ tar -axf file.tgz foo/bar -O
user1742529
12

Ini mencetak konten ./x/y.txt dari a.tar ke STDOUT.

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

Toni
sumber
2
petunjuk: ini adalah huruf kapital "o", bukan nol.
Hubert Grzeskowiak
4

Ini sederhana seperti

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

Trik sulap ini berfungsi jika Anda telah lesspipemenginstal dan jika variabel env LESSOPENdidefinisikan sebagai | /usr/bin/lesspipe.sh %syang diharapkan jika Anda memiliki lesspipe yang diinstal dengan benar.

titik balik matahari
sumber
Itu naskah yang luar biasa - tetapi ada lebih dari satu. Seperti yang saya pahami, inilesspipe.sh mungkin harus lebih disukai.
mikeserv
Apakah itu akan berfungsi pada tarbal terkompresi?
terdon
Itu harus. Tapi saya baru saja menemukan itu tidak berfungsi di ubuntu. Sosok pergi. Mereka telah merusak atau menghapus fitur. Anda masih dapat melihat daftar arsip dengan sedikit tetapi bukan file konten :-(
solsTiCe
2

Oh, tapi ini pertanyaan tentang isi file di dalam tarfile. Dan sebenarnya, dalam beberapa kasus ini tidak terlalu sulit. Masalahnya, tarfile 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 dddan skrip shell yang dapat tarmeningkatkan 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 tarfile dengan cepat dan melakukan transformasi sebaris pada file teks komponennya. Di sana, cutbidang menunjuk ke bidang 1,2,13 dari jalur input terbatas NUL . Hal-hal seperti itu mudah ketika tarfile hanya berisi file teks karena tarpembatas 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.

tarFormat 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 taroperasi 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 tartipe 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 tararsip adalah 20 blok - atau 10.240 bytes. Mengingat arsip diblokir pada ukuran catatan standar dan hanya berisi jenis file standar dan ustarheader standar , Anda harus melompat dari header anggota ke header anggota dengan melakukan pembacaan sesuai dengan sizebidang header sampai Anda menemukan anggota yang cocok dengan yang untuk yang Anda cari. Sesampai di sana, baca dalam sizebyte 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 sizebidangnya 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:

  • ustar
    • The tarinterchange 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 tarfile yang mungkin berisi file yang mungkin berisi data biner sewenang-wenang Anda harus melewati file secara algoritmik, dan sesuai dengan tipe file. Spesifikasi mengatakan:

  • The sizelapangan adalah ukuran file dalam oktet.
    • Jika typeflagbidang diatur untuk menentukan file dengan tipe 1 ( tautan ) atau 2 ( tautan simbolik ) , sizebidang tersebut harus ditentukan sebagai nol.
    • Jika typeflagbidang diatur untuk menentukan file tipe 5 ( direktori ) , sizebidang tersebut harus ditafsirkan sebagaimana dijelaskan di bawah definisi tipe catatan itu.
    • Tidak ada data catatan logis disimpan untuk tipe 1 , 2 , atau 5 .
    • Jika typeflagbidang diatur ke 3 ( file karakter khusus ) , 4 ( blok file khusus ) , atau 6 ( FIFO ) , arti dari sizebidang tersebut tidak ditentukan oleh volume POSIX.1-2008 ini, dan tidak ada catatan logis data yang harus dibuat. disimpan di media.
    • Selain itu, untuk tipe 6 , sizebidang harus diabaikan saat membaca.
  • Jika typeflagbidang 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 tars 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 chksumbidang dan memverifikasi file yang menurut Anda sebenarnya adalah file yang Anda inginkan. tar's chksumcukup sederhana meskipun-:

  • cksum
    • The chksumlapangan 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, chksumbidang diperlakukan seolah-olah semuanya <spasi> karakter.

Tentu saja, Anda sebenarnya tidak perlu melakukan itu, karena tarsudah 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?

mikeserv
sumber
0

Anda dapat menggunakan baris ini

tar -axf a.tar -O
Takomi
sumber
3
Ini akan menunjukkan file apa pun yang ada di tar, bukan hanya y.txtdan tidak jelas dari pertanyaan OP bahwa itu adalah satu-satunya file di tar.
Anthon