web-dev-qa-db-ja.com

複数のファイルに分割またはスパンするtarアーカイブを作成する方法は?

このページ によれば、tarはtarアーカイブを100 Mbファイルに「分割」して作成できます。

tar -c -M --tape-length = 102400 --file = disk1.tar largefile.tgz

問題は、このコマンドでは、最初のファイルがいっぱいになった後で、対話的に次のファイルの新しいファイル名を指定する必要があることです。

誰かがこのインタラクティブなステップをスキップし、タールに「分割」を自動的に行わせる方法を知っていますか?

27
Samuel Lampa

--new-volume-scriptオプションを見てください。これにより、プロンプトメカニズムを別のメカニズムまたは生成されたファイル名に置き換えることができます。 (tar情報ページの(tar.info)Multi-Volume Archives。)splitの問題は、何でもするためにピースをcat一緒に戻す必要があることですが、マルチボリュームアーカイブもう少し柔軟にする必要があります。

20
geekosaur

これには分割を使用できます:

tar czpvf - /path/to/archive | split -d -b 100M - tardisk

これは、データをstdoutに送信し、分割してstdinから選択するようにtarに指示します-さらに数値サフィックス(-d)、チャンクサイズ(-b)100Mで、結果のファイル名(tardisk00、tardisk01、tardisk02など)のベースとして「tardisk」を使用します。

後でデータを抽出するには、これを使用できます。

cat tardisk* | tar xzpvf -
33
Eduardo I.

もちろん、使用するのに最適なオプションは--new-volume-scriptオプション。

ただし、ファイルのサイズ(この場合はlargefile.tgz)がわかっている場合は、次のようにすることもできます。

tar -c -M -L 102400 --file=disk1.tar --file=disk2.tar --file=disk3.tar largefile.tgz

概要:

-c = Create
-M = multi-volume
-L 102400 = 100MB files (disk1.tar, disk2.tar, disk3.tar ...)

(-Lの場合、tarファイルの合計がlargefile.tgzより大きくなるように、必要な数だけ指定します)

ディレクトリツリー構造をtarしようとしている場合

8
user1260486

サイズが1.1GBのファイルが自動的に作成されます。tarのサイズが大きい場合は、数値を増やすことができます。たとえば、1000 {2..1000}にするか、tape-length引数への入力を増やすことができます。

tar --tape-length=1048576 -cMv --file=tar_archive.{tar,tar-{2..100}} backup.tar.lzma
1
GraphicalDot

次のコマンドで動作するようになりました。

mkdir -p ./split
rm -rf ./split/*
tar -cML 102400 -F 'cp "${TAR_ARCHIVE}" \
    ./split/part_${TAR_VOLUME}.tar' \
    -f split/part_1.tar large_file.tar.gz

唯一の問題はpart_1.tarは実際には最後のファイルになり、他のファイルは1つずつシフトされます。つまりpart_2.tarは実際には最初の部分であり、part_k.tar それは (n - 1)番目 部。シェルスクリプトを使用してこれを修正するのは簡単で、読者のための演習として残しました。

1
strupo