サイズが約13GBのtar.gzファイルがあります。約120万のドキュメントが含まれています。これを解凍すると、これらすべてのファイルが1つのディレクトリに配置され、このディレクトリからの読み取りには時間がかかります。tarから複数の新しいフォルダにファイルを分割する方法はありますか?
例:それぞれ1000個のファイルを持つ[1,2、...]という名前の新しいフォルダを作成したいと思います。
これは迅速で汚い解決策ですが、一時ファイルを使用せずに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万個のドキュメントがある場合は、最初にもっと小さいものでテストすることを検討してください。
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 ...
したがって:
tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
tarはその機能を直接提供しません。ファイルは、最初に生成されたのと同じ構造にのみ復元されます。
ソースディレクトリを変更して、そこに目的の構造を作成してから、ツリーをtarすることはできますか?そうでない場合は、ファイル内のファイルを解凍し、スクリプトを使用してそのディレクトリを後処理して、ファイルを目的の配置に移動することができます。ファイルの数を考えると、これには少し時間がかかりますが、少なくともバックグラウンドで実行できます。
マニュアルページを見て、そのようなオプションがあるかどうかを確認できます。最悪の事態は最悪の事態になります。必要なファイルを抽出し(おそらく--excludeを使用して)、それらをフォルダーに配置します。