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

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

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

我想知道是否可以一次开始解压 50 个文件,以便在传输时开始处理这些文件。

答案1

这里详细解释了如何从存档中提取特定文件。具体来说,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:通知它模式适用于任何 / 分隔符之后的成员名称。

答案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 行后终止管道。当管道消失时,我希望焦油也会消失。

相关内容