大きなtarballから特定の数のファイルのみを展開する


12

リモートシステムからローカルシステムへのFTP転送に忙しい大きなtarballがあります。

転送の実行中にそれらのファイルの処理を開始できるように、一度に50個のファイルを展開できるかどうかを知りたいと思います。

回答:


11

ここでは、アーカイブから特定のファイルを抽出することができる方法についての詳細な説明はあります。具体的には、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:パターンが任意の/区切り文字の後のメンバー名に適用されることを通知します。


3
特定のファイルを抽出したくありません。ファイルの名前がわからないので、最初の50個のファイルを抽出したいだけです。
ピーター・ヴァン・ニーケルク

4
「tar -tf」を使用してファイル名のリストを取得し、「head」を使用して最初の50個を取得し、そのリストを抽出するファイル名のリストとして別のtarコマンドにフィードします。「tar -xf file.tar --no-anchored `tar -tf file.tar | head -50`」
サイモンヒッブス

(私のテストでは)部分的にトランスファーされた50番目のファイルを抽出することは非常に可能です-t。どの時点でも、リストには、転送されたファイル名、または転送中のファイル名のみが表示されます。完全なリストではありません。完全にダウンロードされるまで。
Peter.O

2

これを自分で試してはいませんでしたが、これはどうですか:

tar xvf archive.tar | head -n50

Tarは、抽出された各ファイルに対してSTDOUTに1行を出力し、headコマンドは50行後にパイプを強制終了します。パイプが死ぬと、タールも死ぬと思います。


申し訳ありませんが、それはもちろんheadです。答えを変えさせてください。
ジッピー

私はチェックしていませんが、パイプバッファーにより、tarSIGPIPEされる前に50を超えるファイルを抽出する可能性があり、特に最後の不完全なファイルを抽出する可能性があります。
ジル「SO-悪であるのをやめる」

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

そしてそれがすべてです


2
ループ内でtarコマンドを呼び出すには、非常に遅くする必要があります。毎回ファイル全体を読み取りますよね?
swdev 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.