大きなtarballから特定の数のファイルだけを解凍する

大きなtarballから特定の数のファイルだけを解凍する

リモート システムからローカル システムに FTP 転送されている大きな tarball があります。

たとえば、一度に 50 個のファイルの解凍を開始して、転送中にそれらのファイルの処理を開始できるかどうかを知りたいです。

答え1

ここアーカイブから特定のファイルを抽出する方法について詳しく説明します。特に、GNU tar は tarball から 1 つ以上のファイルを抽出するために使用できます。特定のアーカイブ メンバーを抽出するには、正確なメンバー名を引数として指定します。

例えば:

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

特定のグロビング パターン (ワイルドカード) に一致するファイルを抽出することもできます。たとえば、ディレクトリ プレフィックスに関係なく、pic で始まるすべてのファイルを 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 にコマンドライン引数をグロブ パターンとして扱うよう指示します。
--no-anchored: パターンが / 区切り文字の後のメンバー名に適用されることを通知します。

答え2

tar -tvf tarfile.tar

ファイルの全リストを表示しますtarfile.tar

tar -xvf tarfile.tar fileToRestore  

このコマンドは、fileToRestore

複数のファイルを解凍するには、次の操作を実行します (ただし、すべてのファイルを解凍するわけではありません)。

  • すべてのファイルリストtarfile.tartar.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 は抽出されたファイルごとに 1 行を STDOUT に出力し、headコマンドは 50 行後にパイプを終了します。パイプが終了すると、tar も終了すると予想されます。

関連情報