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

Вероятно, имеет место, что это было удалено в последнем Debian, Сжимают ядро (который является, где проблема была), и это теперь возвратилось в 2.6.38. Я говорю, что, потому что это прокладывало себе путь, прежде чем Сжатие было выпущено (и я только использую нетронутые пакеты ядра Debian).

12
03.07.2012, 09:20
3 ответа

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

Например:

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

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

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 команду рассматривать параметры командной строки как globbing шаблоны.
--no-anchored: сообщает этому, что шаблоны относятся к именам элемента после любого / разделитель.

11
27.01.2020, 19:56
  • 1
    я не хочу извлекать определенные файлы. Я просто хочу извлечь первые 50 файлов, поскольку я не знаю, каковы названия файлов. –  Pieter van Niekerk 03.07.2012, 09:35
  • 2
    Можно получить список имен файлов с помощью "tar-tf", взять первые 50 использований "голова", затем подать тот список в другую команду tar как список имен файлов для извлечения. Как это: "tar-xf file.tar - нет - привязанный 'tar-tf файл tar|head-50'" –  Simon Hibbs 03.07.2012, 12:01
  • 3
    Довольно возможно (в моем тестировании) извлечь частично trandferred 50-й файл.. Это была бы хорошая идея постараться не извлекать (текущий) последний файл в -t список до tarball полностью загружается. В любом моменте времени список показывает только имена файлов, которые были или являются, переданы, т.е. не полный список; пока это полностью не загружается. –  Peter.O 04.07.2012, 06:36

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

tar xvf archive.tar | head -n50

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

2
27.01.2020, 19:56
  • 1
    Извините, это должно, конечно, a head. Позвольте мне изменить свой ответ. –  jippie 04.07.2012, 00:36
  • 2
    , который я не проверил, но я боюсь что из-за буфера канала, tar может извлечь больше чем 50 файлов, прежде чем это будет SIGPIPEd, и в особенности это может извлечь последний, неполный файл. –  Gilles 'SO- stop being evil' 04.07.2012, 01:18
tar -tvf tarfile.tar

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

tar -xvf tarfile.tar fileToRestore  

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

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

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

     tar -tvf tarfile.tar> tar.  текст
     
  • Теперь 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 ""

И все

2
27.01.2020, 19:56

Теги

Похожие вопросы