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
の新しいフォルダーになります。これは正しいです?特に、抽出するフォルダーの欠落しているスラッシュ(相対パス)と、作成するフォルダーの先頭のスラッシュを含む絶対パス
すでに/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
tar
は相対パスを格納します
特定のフォルダーを抽出する必要がある場合は、tarファイルの内容を確認してください。
tar -tvf archive.tar.gz
そして、正確なファイル名に注意してください。 tar -xvf foo.tar folder/in/archive
#注:先行スラッシュなし