Batalkan hanya sejumlah file tertentu dari tarball besar

12

Saya memiliki tarball besar yang sibuk di-FTP-kan dari sistem jarak jauh ke sistem lokal kami.

Saya ingin tahu apakah mungkin untuk memulai pembatalan perintah katakanlah 50 file sekaligus sehingga file-file itu dapat mulai diproses saat transfer berlangsung.

Pieter van Niekerk
sumber

Jawaban:

11

Berikut adalah penjelasan terperinci tentang bagaimana mungkin mengekstrak file tertentu dari arsip. Secara khusus GNU tar dapat digunakan untuk mengekstrak satu atau lebih file dari tarball. Untuk mengekstrak anggota arsip tertentu, berikan nama anggota yang tepat sebagai argumen.

Sebagai contoh:

tar --extract --file={tarball.tar} {file}

Anda juga dapat mengekstrak file-file yang cocok dengan pola globbing tertentu (wildcard). Misalnya, untuk mengekstrak dari cbz.tar semua file yang dimulai dengan pic, apa pun awalan direktori mereka, Anda dapat mengetik:

tar -xf cbz.tar --wildcards --no-anchored 'pic*'

Untuk mengekstrak semua file php, masukkan:

tar -xf cbz.tar --wildcards --no-anchored '*.php'

Dimana,

-x: menginstruksikan tar untuk mengekstrak file.
-f: menentukan nama file / nama tarball.
-v: Verbose (tampilkan kemajuan saat mengekstraksi file).
-j: filter arsip melalui bzip2, gunakan untuk mendekompres file .bz2.
-z: filter arsip melalui gzip, gunakan untuk mendekompresi file .gz.
--wildcards: menginstruksikan tar untuk memperlakukan argumen baris perintah sebagai pola globbing.
--no-anchored: menginformasikan bahwa pola berlaku untuk nama anggota setelah / pembatas.

Eugene S
sumber
3
Saya tidak ingin mengekstrak file tertentu. Saya hanya ingin mengekstrak 50 file pertama karena saya tidak tahu apa nama file tersebut.
Pieter van Niekerk
4
Anda bisa mendapatkan daftar nama file menggunakan "tar -tf", ambil 50 pertama menggunakan "head", kemudian masukkan daftar itu ke perintah tar lain sebagai daftar nama file untuk diekstrak. Seperti ini: "tar -xf file.tar --tidak-berlabuh` tar -tf file.tar | head -50` "
Simon Hibbs
Sangat mungkin (dalam pengujian saya) untuk mengekstrak file ke-50 yang sebagian ditandatangi. Adalah ide yang baik untuk menghindari mengekstraksi file terakhir (saat ini) dalam -tdaftar sampai tarball sepenuhnya diunduh. Kapan saja, daftar hanya menampilkan nama file yang telah, atau sedang ditransfer, yaitu. bukan daftar lengkap ; sampai sepenuhnya diunduh.
Peter.O
2

Tidak mencobanya sendiri, tetapi bagaimana dengan ini:

tar xvf archive.tar | head -n50

Tar mengeluarkan satu baris ke STDOUT untuk setiap file yang diekstraksi, maka headperintah itu akan mematikan pipa setelah 50 baris. Setelah pipa mati, saya berharap tar akan mati juga.

jippie
sumber
Maaf, itu tentu saja harus head. Biarkan saya mengubah jawaban saya.
jippie
Saya belum memeriksa, tetapi saya khawatir karena buffer pipa, tardapat mengekstraksi lebih dari 50 file sebelum itu SIGPIPEd, dan khususnya mungkin mengekstrak file terakhir yang tidak lengkap.
Gilles 'SANGAT berhenti menjadi jahat'
2
tar -tvf tarfile.tar

memberi Anda seluruh daftar file di tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Perintah ini mengembalikan fileToRestore

Untuk menghapus beberapa file, tetapi tidak semuanya, Anda dapat:

  • Anda menempatkan semua daftar file dari tarfile.tardalamtar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Sekarang tar.txtmemiliki seluruh daftar file tarfile.tar dan Anda hanya dapat meninggalkan file yang ingin Anda kembalikan atau dengan kepala ...

    head -n50 tar.txt > tar2.txt
    

Anda dapat meletakkan baris-baris ini ke dalam file

cat tar.txt|while read line
do
   tar -xvf tarfile.tar ${line}
done

Atau file skrip lengkap:

#!/bin/bash

if [[ "$1" = "" || "$2" = "" ]]
   then
   echo ""
   echo "Uso: untar-list.sh tarfile.tar listfile.txt"
   echo ""
   exit 1
fi

tarfile=$1
file=$2

if [[ ! -f ${tarfile} ]]
   then
   echo ""
   echo "Archivo ${tarfile} no existe"
   echo ""
   exit 1
fi

if [[ ! -f ${file} ]]
   then
   echo ""
   echo "Archivo ${file} no existe"
   echo ""
   exit 1
fi

cat ${file}|while read line
do
  tar -xvf ${tarfile} ${line}
done

echo ""
echo "Finalizado"
echo ""

Dan itu saja

pengguna84196
sumber
2
Itu harus sangat lambat untuk memanggil perintah tar dalam satu lingkaran. Itu membaca seluruh file setiap kali, kan?
swdev