从大型tarball解压缩仅一定数量的文件


12

我有一个大型的tarball,正忙于通过FTP将其从远程系统传输到本地系统。

我想知道是否有可能一次开始解压缩,例如说50个文件,以便在传输发生时可以开始处理这些文件。

Answers:


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个文件,因为我不知道文件名是什么。
Pieter van Niekerk

4
您可以使用“ tar -tf”获取文件名列表,使用“ head”获取前50个文件名,然后将该列表作为另一个要提取的文件名列表送入另一个tar命令。像这样:“ tar -xf file.tar --no-anchored`tar -tf file.tar | head -50`”
Simon Hibbs

(在我的测试中)完全有可能提取部分被转移的第50个文件。.最好在-t完全下载tarball之前避免提取列表中的(当前)最后一个文件。在任何时候,列表仅显示已经或正在传输的文件名,即。不是完整列表;直到完全下载。
Peter.O 2012年

2

我自己没有尝试过,但是如何做:

tar xvf archive.tar | head -n50

Tar为提取的每个文件向STDOUT输出一行,然后该head命令将在50行之后终止管道。管道快死了,我希望焦油也死掉。


抱歉,那当然应该是head。让我更改答案。
jippie 2012年

我没有检查,但是我担心由于管道缓冲区tar的原因,它可能在SIGPIPEd之前提取了50多个文件,尤其是可能提取了最后一个不完整的文件。
吉尔(Gilles)'所以

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 ""

就这样


2
在循环中调用tar命令必须非常缓慢。每次都读取整个文件,对吗?
swdev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.