我可以从 tar 存档中提取特定文件,如下所示:
tar xvf gh_2.5.1_linux_armv6.tar.gz gh_2.5.1_linux_armv6/bin/gh
这将提取到当前目录,但gh
文件仍在存档的目录结构内。有没有办法将文件提取到当前或任何给定目录中?
答案1
对于 gnu tar,请尝试
tar xvf gh_2.5.1_linux_armv6.tar.gz --one-top-level=. gh_2.5.1_linux_armv6/bin/gh
--one-top-level
或者,按照注释中的建议,在本示例中使用 ,而不是--strip-components=2
,但如果您想从不同的目录中提取多个文件,这可能不起作用。
答案2
使用 GNU tar 回答:
tar xvf gh_2.5.1_linux_armv6.tar.gz gh_2.5.1_linux_armv6/bin/gh -O > gh
您可以尝试上面的代码块。O
选项正在使输出成为标准输出。所以你与重定向运算符结合起来。
答案3
正如评论中所建议的,对于单个文件或位于存档中同一级别的多个文件,该选项可以--strip-components=N
正常工作。适用于位于存档中任何位置的任意数量的文件的
另一个 GNU选项是(或tar
--xform
--transform
)。它允许使用类似以下形式的替换表达式
来修改文件名:sed
s/regexp/replace/[flags]
因此,在您的情况下,表达式s|.*/||
会从文件路径中删除所有主要组件,即
tar xvf gh_2.5.1_linux_armv6.tar.gz --xform='s|.*/||' gh_2.5.1_linux_armv6/bin/gh
仅提取gh
当前目录中的文件(没有任何父目录)。此外,人们还可以看到使用选项应用所请求的转换--show-transformed-names
,例如试运行:
tar -tf archive.tar.gz --xform='s|.*/||' --show-transformed-names
这可以与其他选项结合使用,例如基于模式提取到另一个目录:
tar -xvzf archive.tar.gz --xform='s|.*/||' -C dest_dir --wildcards --no-anchored 'match*'