У меня есть большой 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 тоже умрет.