21456


複数個のtarファイル（正確にはtar.bz2）が存在するとき、各tarファイルが内包するファイル群を単一のtarファイル（こちらもtar.bz2）に再構成したいです。

このとき、入力tarファイル群のファイル名部分をサブ・ディレクトリ名とし、出力tarファイル内では各サブ・ディレクトリ配下に入力tarファイル内容がそれぞれ配置されるようにしたいと考えています。

入出力tarファイルのイメージは下記の通りです：

[code]

    入力tarファイル群
    $ ls
    aaa.tar.bz2  bbb.tar.bz2  ccc.tar.bz2
    $ tar -tf aaa.tar.bz2
    ./123
    $ tar -tf bbb.tar.bz2
    ./XYZ
    $ tar -tf ccc.tar.bz2
    ./日本語
    
    期待する出力tarファイル
    $ tar -tf repacking.tar.bz2
    ./aaa/123
    ./bbb/XYZ
    ./ccc/日本語
    
[/code]

一旦全ての入力tarファイル群を展開し、その後で出力tarファイルを再構成していけば実現は可能なのですが、ディスク使用量を抑えるという観点から、なるべくファイルを展開しないですむ解法はないものでしょうか。

実行環境：

[code]

    $ cat /etc/centos-release
    CentOS Linux release 7.1.1503 (Core)
    $ tar --version
    tar (GNU tar) 1.26
    
[/code]


CC BY-SA 3.0
2016-01-28T09:35:10.037
21440
2016-01-28T18:22:37.983
2016-01-28T09:54:21.800
49
49
question
linux centos
複数tar内容を個別ディレクトリに配置して単一tarファイルを再構成したい


Python(version 2.7.11) を使ってみました。

**concat_tbz2.py**

[code]

    #!/usr/bin/python
    
    import os.path
    import sys
    import tarfile
    
    out = tarfile.open(sys.argv[1], mode='w:bz2')
    for tf in sys.argv[2:]:
      dir = os.path.basename(tf).split('.')[0]
      tar = tarfile.open(tf, mode='r')
      for m in tar:
        m.name = dir + '/' + m.name
        out.addfile(m, fileobj=tar.extractfile(m))
      tar.close()
    
    out.close()
    
[/code]

**使用例**

[code]

    $ ./concat_tbz2.py repacking.tar.bz2 aaa.tar.bz2 bbb.tar.bz2 ccc.tar.bz2
    $ tar -tf repacking.tar.bz2
    aaa/123
    bbb/XYZ
    ccc/日本語
    
[/code]

まぁ、エラーチェックは省いて最低限動作するだけのシロモノですので、気を付けてご使用下さい。


CC BY-SA 3.0
2016-01-28T18:22:37.983
21456
2016-01-28T18:22:37.983
21440
answer