4

サイズが約13GBのtar.gzファイルがあります。約120万のドキュメントが含まれています。これを解凍すると、これらすべてのファイルが1つのディレクトリに配置され、このディレクトリからの読み取りには時間がかかります。tarから複数の新しいフォルダにファイルを分割する方法はありますか?

例:それぞれ1000個のファイルを持つ[1,2、...]という名前の新しいフォルダを作成したいと思います。

4

5 に答える 5

4

これは迅速で汚い解決策ですが、一時ファイルを使用せずにBashで機能します。

i=0                                 # file counter
dir=0                               # folder name counter
mkdir $dir                          
tar -tzvf YOURFILE.tar.gz |
cut -d ' ' -f12 |                   # get the filenames contained in the archive
while read filename
    do 
        i=$((i+1))
        if [ $i == 1000 ]           # new folder for every 1000 files
        then
            i=0                     # reset the file counter
            dir=$((dir+1))
            mkdir $dir
        fi
        tar -C $dir -xvzf YOURFILE.tar.gz $filename
    done

ワンライナーと同じ:

i=0; dir=0; mkdir $dir; tar -tzvf YOURFILE.tar.gz | cut -d ' ' -f12 | while read filename; do i=$((i+1)); if [ $i == 1000 ]; then i=0; dir=$((dir+1)); mkdir $dir; fi; tar -C $dir -xvzf YOURFILE.tar.gz $filename; done

シェルの設定によっては、tarのコンテンツ出力の最後の列(ファイル名)を取得するための「cut-d'' -f12」部分が問題を引き起こす可能性があり、それを変更する必要があります。

1000個のファイルで機能しましたが、アーカイブに120万個のドキュメントがある場合は、最初にもっと小さいものでテストすることを検討してください。

于 2010-08-29T15:06:11.697 に答える
1

GNUをお持ちの場合は、とオプションtarを利用できる可能性があります。私はこれをテストしていませんが、私は次のようなことを考えています:--checkpoint--checkpoint-action

# UNTESTED
cd /base/dir
mkdir  $(printf "dir%04d\n" {1..1500})  # probably more than you need
ln -s dest0 linkname
tar -C linkname ... --checkpoint=1000 \
        --checkpoint-action='sleep=1' \
        --checkpoint-action='exec=ln -snf dest%u linkname ...
于 2010-08-29T15:16:22.270 に答える
1
  • --listを使用してファイル名リストを取得します
  • grepでファイル名を含むファイルを作成する
  • --files-fromを使用してこれらのファイルのみを解凍します

したがって:

tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
于 2010-08-29T13:44:44.063 に答える
0

tarはその機能を直接提供しません。ファイルは、最初に生成されたのと同じ構造にのみ復元されます。

ソースディレクトリを変更して、そこに目的の構造を作成してから、ツリーをtarすることはできますか?そうでない場合は、ファイル内のファイルを解凍し、スクリプトを使用してそのディレクトリを後処理して、ファイルを目的の配置に移動することができます。ファイルの数を考えると、これには少し時間がかかりますが、少なくともバックグラウンドで実行できます。

于 2010-08-29T14:09:13.113 に答える
0

マニュアルページを見て、そのようなオプションがあるかどうかを確認できます。最悪の事態は最悪の事態になります。必要なファイルを抽出し(おそらく--excludeを使用して)、それらをフォルダーに配置します。

于 2010-08-29T13:39:16.570 に答える