ディレクトリを作成せずに、tar ファイル内のディレクトリからファイルを抽出する

ディレクトリを作成せずに、tar ファイル内のディレクトリからファイルを抽出する

次のような構造の tarfile があります。

- dir1
 -- file
- dir2
- dir3

を実行しようとするとtar -xf tarfile.tar.gz dir1/file、ファイルを含む dir1 が作成されます。代わりに、間にディレクトリを挟まずにファイルのみを取得したいと思います。ファイルを移動してディレクトリを削除することもできますが、tar コマンドでそれを直接実行できるかどうか疑問に思っています。

Alpine Linuxを使用しています。

答え1

POSIX 準拠 ( gunzipPOSIX コマンドではない部分を除く):

gunzip < file.tar.gz | pax -rs'|.*/||' dir1/file1

bsdtar

tar -s'|.*/||' -xf file.tar.gz dir1/file1

GNUの場合tar:

tar --transform='s|.*/||' -xf file.tar.gz dir1/file1

star

star -s '|*/||' -x -f file.tar.gz dir1/file1

これらのうちいくつかについては、ファイルがシンボリックリンクである場合、置換はシンボリックリンクのターゲットにも影響することに注意してください。

答え2

stdout (-O) に抽出し、必要なファイル名にパイプすることができます。

答え3

これが Ruby での私の解決策です。シンボリック リンクを適切に処理しようとはしていませんが、もちろん追加することは可能です。

outfiles = `tar zxvf #{ARGV[0]}`
root_dirs = {}
outfiles.each_line do |l|
  s = l.split('/')
  root_dirs[s[0]] = 1
  `mv #{l.chomp} ./#{s[-1]}`
end
root_dirs.each_key {|rd| `rm -rf #{rd}`}

関連情報