web-dev-qa-db-ja.com

tarballから特定のフォルダーを特定のフォルダーに抽出します

Ubuntu 14.04でtarballを作成しました:

cd /tmp
tar -cfvz archive.tar.gz /folder

次に、tarball内の特定のフォルダー(tarball内の/tmpにある)を特定のフォルダーに抽出します。

cd /tmp
tar -xfvz archive.tar.gz folder/in/archive -C /tmp/archive

結果は、archiveと呼ばれる/tmpの新しいフォルダーになります。これは正しいです?特に、抽出するフォルダーの欠落しているスラッシュ(相対パス)と、作成するフォルダーの先頭のスラッシュを含む絶対パス

3
musbach

Tl; dr

すでに/tmpにいるので、-Cオプションを破棄して(デフォルトではtarが現在の作業ディレクトリにファイルを抽出するため)、--strip-components=2を追加するだけです。

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive

GNU tarはデフォルトで相対パスを保存します。

アーカイブが相対パスを使用するかどうかは、tar -tf archive | head -n 1を実行することで確認できます。これにより、アーカイブ内の最初のファイルのパスが出力されます。そのファイルのパスが相対パスの場合、アーカイブ内のすべてのファイルは相対パスを使用します。

% tar -tf bash-4.3.tar.gz | head -n 1
bash-4.3/

祖先なしで相対パスを使用するアーカイブから単一のファイル/フォルダーを相対パスに抽出するには、2つのオプションが必要です。-Cおよび--strip-components=N:アーカイブの下の例ではbash-4.3.tar.gz相対パスを使用し、相対パスに抽出されるファイルbash-4.3/doc/bash.htmlを含むpath-Cはファイルを抽出するディレクトリを指定し、--strip-components=2は親を指定します抽出されたファイルの親の親は無視される必要があるため、この場合はbash.htmlのみがターゲットディレクトリに抽出されます)。

% tree
.
├── bash-4.3.tar.gz
└── path

1 directory, 1 file
% tar -tf bash-4.3.tar.gz | grep -F 'bash.html'
bash-4.3/doc/bash.html
% tar -C path --strip-components=2 -zxf bash-4.3.tar.gz bash-4.3/doc/bash.html
% tree
.
├── bash-4.3.tar.gz
└── path
    └── bash.html

1 directory, 2 files

コマンドに戻ります。すでに/tmpにいるので、-Cオプションを破棄するだけで(デフォルトではtarが現在の作業ディレクトリのファイルを抽出するため)、追加するだけです。 --strip-components=2

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive
8
kos

tarは相対パスを格納します

特定のフォルダーを抽出する必要がある場合は、tarファイルの内容を確認してください。

tar -tvf archive.tar.gz

そして、正確なファイル名に注意してください。 tar -xvf foo.tar folder/in/archive
#注:先行スラッシュなし

1
daumie