Büyük bir tarball'dan sadece belirli sayıda dosyayı aç


12

Uzak bir sistemden yerel sistemimize FTP'lenmiş olmakla meşgul büyük bir tarball var.

Ben bir seferde 50 dosya diyelim untarring başlatmak mümkün olup olmadığını bilmek istiyorum böylece aktarım sırasında bu dosyaları işlenmeye başlayabilirsiniz.

Yanıtlar:


12

İşte bir arşivden belirli dosyaları nasıl ayıklayabileceğinize dair ayrıntılı bir açıklama. Özellikle GNU katranı, bir tarball'dan bir veya daha fazla dosyayı ayıklamak için kullanılabilir. Belirli arşiv üyelerini çıkarmak için üye adlarını bağımsız değişken olarak belirtin.

Örneğin:

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

Belirli bir globbing deseniyle (joker karakterler) eşleşen dosyaları da çıkarabilirsiniz. Örneğin, dizin öneki ne olursa olsun, pic ile başlayan tüm dosyaları cbz.tar dosyasından ayıklamak için şunu yazabilirsiniz:

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

Tüm php dosyalarını ayıklamak için şunu girin:

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

Nerede,

-x: zift'e dosyaları çıkarmasını söyler.
-f: dosya adını / tarball adını belirtir.
-v: Ayrıntılı (dosyaları ayıklarken ilerlemeyi göster).
-j: arşivi bzip2 ile filtreleyin, .bz2 dosyalarını açmak için kullanın.
-z: arşivi gzip ile filtreleyin, .gz dosyalarını açmak için kullanın.
--wildcards: katran'a komut satırı argümanlarını globbing kalıpları olarak ele alma talimatı verir.
--no-anchored: kalıpların herhangi bir / sınırlayıcıdan sonra üye adlarına uygulandığını bildirir.


3
Belirli dosyaları ayıklamak istemiyorum. Dosya adlarının ne olduğunu bilmediğim için sadece ilk 50 dosyayı ayıklamak istiyorum.
Pieter van Niekerk

4
"Tar -tf" komutunu kullanarak dosya adlarının bir listesini alabilir, "head" komutunu kullanarak ilk 50 adımı alabilir, ardından bu listeyi ayıklanacak dosya adları listesi olarak başka bir tar komutuna aktarabilirsiniz. Bunun gibi: "tar -xf file.tar --no-anchored` tar -tf file.tar | head -50` "
Simon Hibbs

Kısmen devredilen bir 50. dosyayı ayıklamak (testimde) mümkündür. Tarball -ttamamen indirilene kadar listedeki (mevcut) son dosyayı ayıklamaktan kaçınmak iyi bir fikir olacaktır . Herhangi bir zamanda, liste yalnızca aktarılan veya aktarılan dosya adlarını gösterir. tam liste değil ; tamamen indirilene kadar.
Peter.O

2

Bunu kendim denemedim, ama buna ne dersin:

tar xvf archive.tar | head -n50

Tar, çıkarılan her dosya için STDOUT'a bir satır verir, ardından headkomut 50 satırdan sonra boruyu öldürür. Borunun ölmesi üzerine katranın da ölmesini beklerdim.


Üzgünüm, bu tabii ki bir head. Cevabımı değiştireyim.
jippie

Kontrol etmedim, ancak boru tamponu nedeniyle, tarSIGPIPEd olmadan önce 50'den fazla dosya ayıklayabileceğinden ve özellikle de son, eksik dosyayı ayıklayabileceğinden korkuyorum.
Gilles 'SO- kötü olmayı kes'

2
tar -tvf tarfile.tar

içindeki dosyaların tüm listesini verir tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Bu komut fileToRestore

Birden çok dosyanın yıldız işaretini kaldırmak, ancak hepsinin değil:

  • Sen tüm dosya listesini hazırladık tarfile.tariçinetar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Şimdi tar.txttüm dosyaların listesi var tarfile.tar ve sadece geri yüklemek istediğiniz dosyaları veya kafa ile bırakabilirsiniz ...

    head -n50 tar.txt > tar2.txt
    

Bu satırları bir dosyaya koyabilirsiniz

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

Veya tam komut dosyası:

#!/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 ""

Ve hepsi bu


2
Bir döngüdeki tar komutunu çağırmak için bu acı verici bir şekilde yavaş olmalıdır. Her seferinde tüm dosyayı okur, değil mi?
swdev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.