web-dev-qa-db-ja.com

7zコマンドラインファイルをフラットディレクトリに追加7zファイル

ファイル「./data/x.txt」をパス「./data/x.7z」に圧縮したいと思います。

走っているとき

7z a ./data/x.txt.7z ./data/x.txt

ファイル "./data/x.txt"は保持します

data/x.txt

ただ(私が欲しいもの)とは対照的に

x.txt

ただし、7zではx.7zファイル内のパス「./data」ディレクトリを無視したいと思います。明確にするために、x.txtを追加するときに、7zで7zファイルのディレクトリ構造をフラット化する必要があります。

これは可能ですか?

1
paragbaxi

私のために働く代替案を考え出した。 subprocess を利用して7zを呼び出しています。 cwd属性は、サブプロセスコマンドの作業ディレクトリを変更します。以下のコードは、上記の例を解決します。ここで、「data」はファイルを追加するパスです。

args = [
        '7z',
        'a',
        filename_7z,
        filename,
        ]
output = subprocess.check_output(args, cwd = 'data').decode("utf-8")
1
paragbaxi

考えられる解決策の1つは、圧縮する前にディレクトリにchdirすることです。例えば:

$ cd data; 7z a ../test.7z *
$ 7z l ../test.7z
...

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2011-02-18 15:29:53 ....A            6           11  x.txt
------------------- ----- ------------ ------------  ------------------------
...

さらに別の方法は、別のアーカイバを使用することです。 rar。便利なコマンドラインスイッチがたくさんあります。あなたの問題は-ep/-ep1オプションで解決することができます:

$ rar a -ep test.rar data

または

$ rar a -ep1 test.rar data

rarヘルプの一部:

  ep            Exclude paths from names
  ep1           Exclude base directory from names
1
dr.

dr01が答えたものは一般的に正しいのですが、なぜ1つのファイルを圧縮するために7zを使用するのでしょうか。

xz 、またはディストリビューションで利用できる場合は pxz もご覧になることをお勧めします。 xztarでうまく機能し、新しいバージョンのtarには「-J」スイッチがあり、xzを介して実行されます。

いずれにしても、xzまたはbzip2を使用するのと同じように、gzipを使用して単一のファイルを圧縮できます。

$ xz file.txt

(ファイルfile.txt.xzを作成します)

0
polemon