Распаковывать только определенное количество файлов из большого тарбола

Распаковывать только определенное количество файлов из большого тарбола

У меня есть большой tarball, который пересылается по FTP с удаленной системы на нашу локальную систему.

Я хочу узнать, возможно ли начать распаковку, скажем, 50 файлов за раз, чтобы эти файлы можно было начать обрабатывать во время передачи.

решение1

Здесьподробное объяснение того, как можно извлечь определенные файлы из архива. В частности, GNU tar можно использовать для извлечения одного или нескольких файлов из tarball. Чтобы извлечь определенные элементы архива, укажите их точные имена в качестве аргументов.

Например:

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

Вы также можете извлечь те файлы, которые соответствуют определенному шаблону подстановки (wildcards). Например, чтобы извлечь из cbz.tar все файлы, которые начинаются с pic, независимо от префикса их каталога, вы можете ввести:

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

Чтобы извлечь все файлы PHP, введите:

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

Где,

-x: указывает tar на необходимость извлечения файлов.
-f: указывает имя файла / имя tarball.
-v: Подробно (показывает ход извлечения файлов).
-j: фильтрует архив с помощью bzip2, используется для распаковки файлов .bz2.
-z: фильтрует архив с помощью gzip, используется для распаковки файлов .gz.
--wildcards: указывает tar на необходимость обработки аргументов командной строки как шаблонов подстановки.
--no-anchored: сообщает, что шаблоны применяются к именам членов после любого разделителя /.

решение2

tar -tvf tarfile.tar

дает вам полный список файлов вtarfile.tar

tar -xvf tarfile.tar fileToRestore  

Эта команда восстанавливаетfileToRestore

Чтобы распаковать несколько файлов, но не все из них, можно:

  • Вы помещаете весь список файлов из tarfile.tarвtar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Теперь tar.txtу вас есть полный список файлов, tarfile.tar и вы можете оставить только те файлы, которые хотите восстановить, или с заголовком...

    head -n50 tar.txt > tar2.txt
    

Вы можете поместить эти строки в файл

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

Или полный файл скрипта:

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

И это все

решение3

Сам не пробовал, но как насчет этого:

tar xvf archive.tar | head -n50

Tar выводит строку в STDOUT для каждого извлеченного файла, затем headкоманда убьет канал после 50 строк. После того, как канал умрет, я бы ожидал, что tar тоже умрет.

Связанный контент