我有一个 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}`}