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

12

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

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

Питер ван Никерк
источник

Ответы:

12

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

Например:

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

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

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

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

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

Где,

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

Евгений С
источник
3
Я не хочу извлекать конкретные файлы. Я просто хочу извлечь первые 50 файлов, так как я не знаю, как называются эти файлы.
Питер ван Никерк
4
Вы можете получить список имен файлов с помощью «tar -tf», взять первые 50 с помощью «head», а затем передать этот список в другую команду tar в качестве списка имен файлов для извлечения. Примерно так: "tar -xf file.tar --no-anchored` tar -tf file.tar | head -50` "
Саймон Хиббс
Вполне возможно (в моем тестировании) извлечь частично переданный 50-й файл. Было бы неплохо избегать извлечения (текущего) последнего файла в -tсписке до полной загрузки архива. В любой момент времени в списке отображаются только те имена файлов, которые были или были переданы, т.е. не полный список; пока он не будет полностью загружен.
Peter.O
2

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

tar xvf archive.tar | head -n50

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

jippie
источник
Извините, это, конечно, должно быть head. Позвольте мне изменить свой ответ.
Джиппи
Я не проверял, но боюсь, что из-за буфера канала tarможет извлечь более 50 файлов до его SIGPIPEd, и, в частности, он может извлечь последний, неполный файл.
Жиль "ТАК - перестань быть злым"
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 ""

И это все

user84196
источник
2
Это должно быть мучительно медленно вызывать команду tar в цикле. Он читает весь файл каждый раз, верно?
swdev