Rozpakuj tylko pewną liczbę plików z dużego archiwum

12

Mam duży plik tar, który jest zajęty przesyłaniem FTP ze zdalnego systemu do naszego lokalnego systemu.

Chcę wiedzieć, czy można rozpocząć rozpakowywanie, powiedzmy 50 plików jednocześnie, aby pliki te mogły być przetwarzane podczas przesyłania.

Pieter van Niekerk
źródło

Odpowiedzi:

12

Oto szczegółowe wyjaśnienie, w jaki sposób można wyodrębnić określone pliki z archiwum. W szczególności GNU tar może być użyty do wyodrębnienia jednego lub więcej plików z tarballa. Aby wyodrębnić określonych członków archiwum, podaj ich dokładne nazwy jako argumenty.

Na przykład:

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

Możesz także wyodrębnić pliki, które pasują do określonego wzorca globowania (symbole wieloznaczne). Na przykład, aby wyodrębnić z cbz.tar wszystkie pliki zaczynające się od pic, bez względu na ich prefiks katalogu, możesz wpisać:

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

Aby wyodrębnić wszystkie pliki php, wprowadź:

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

Gdzie,

-x: instruuje tar, aby wyodrębnił pliki.
-f: określa nazwę pliku / nazwy pliku tarball.
-v: Verbose (pokaż postęp podczas rozpakowywania plików).
-j: filtruj archiwum przez bzip2, użyj do dekompresji plików .bz2.
-z: filtruj archiwum przez gzip, użyj do dekompresji plików .gz.
--wildcards: instruuje tar, aby traktował argumenty wiersza poleceń jako wzorce globowania.
--no-anchored: informuje, że wzorce dotyczą nazw członków po dowolnym znaku / separatorze.

Eugene S.
źródło
3
Nie chcę wyodrębniać określonych plików. Chcę tylko wyodrębnić pierwsze 50 plików, ponieważ nie wiem, jakie są nazwy plików.
Pieter van Niekerk
4
Możesz uzyskać listę nazw plików za pomocą „tar -tf”, weź pierwsze 50 za pomocą „head”, a następnie wprowadź tę listę do innego polecenia tar jako listę nazw plików do wyodrębnienia. Jak to: "tar -xf file.tar --no-anchored` tar -tf file.tar | head -50` "
Simon Hibbs
Jest całkiem możliwe (w moich testach) wyodrębnienie częściowo trandferowanego 50. pliku. Dobrym pomysłem byłoby uniknięcie wyodrębnienia (bieżącego) ostatniego pliku z -tlisty, dopóki archiwum nie zostanie w pełni pobrane. W dowolnym momencie na liście wyświetlane są tylko nazwy plików, które zostały lub są przenoszone, tj. nie pełna lista; dopóki nie zostanie w pełni pobrany.
Peter.O
2

Nie próbowałem tego sam, ale co z tym:

tar xvf archive.tar | head -n50

Tar wysyła linię do STDOUT dla każdego wyodrębnionego pliku, a następnie headpolecenie zabije potok po 50 liniach. Po śmierci fajki spodziewałbym się, że smoła też umrze.

jippie
źródło
Przepraszam, to oczywiście powinno być head. Pozwól mi zmienić moją odpowiedź.
jippie
Nie sprawdziłem, ale obawiam się, że z powodu bufora potoku tarmoże wyodrębnić więcej niż 50 plików przed SIGPIPEd, aw szczególności może wyodrębnić ostatni, niekompletny plik.
Gilles „SO- przestań być zły”
2
tar -tvf tarfile.tar

daje ci całą listę plików w tarfile.tar

tar -xvf tarfile.tar fileToRestore  

To polecenie przywraca fileToRestore

Aby rozpakować wiele plików, ale nie wszystkie, możesz:

  • Umieszczasz wszystkie listy plików z tarfile.tarwtar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Teraz tar.txtma całą listę plików tarfile.tar i możesz zostawić tylko pliki, które chcesz przywrócić lub z głową ...

    head -n50 tar.txt > tar2.txt
    

Możesz umieścić te linie w pliku

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

Lub pełny plik skryptu:

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

I to wszystko

użytkownik84196
źródło
2
To musi być boleśnie powolne, aby wywołać polecenie tar w pętli. Czyta cały plik za każdym razem, prawda?
swdev