从 tar 文件内的目录提取文件而不创建该目录

从 tar 文件内的目录提取文件而不创建该目录

我有一个 tarfile,其结构如下:

- dir1
 -- file
- dir2
- dir3

如果我尝试运行tar -xf tarfile.tar.gz dir1/file,将创建包含该文件的 dir1。我想只获取文件而不需要中间的目录。我可以移动文件并删除目录,但我想知道 tar 命令是否提供直接执行此操作的支持。

我正在使用 Alpine Linux。

答案1

POSIXly(除了gunzip非 POSIX 命令的部分):

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

您可以提取到标准输出(-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}`}

相关内容