Shell 在tar存档中输出根目录

Shell 在tar存档中输出根目录,shell,debian,tar,Shell,Debian,Tar,我试图自动化您在使用shell脚本编译nginx之类的东西时所经历的过程。(我不想使用apt-get) 目前我有: wget http://nginx.org/download/nginx-1.0.0.tar.gz tar xf nginx-1.0.0.tar.gz 但是接下来我需要找出目录名是从哪里提取的,这样我就可以启动配置脚本了。目录名应该是nginx-1.0.0或者没有.tar.gz的tarball名称。在wget和tar之后尝试以下操作: cd nginx* ./configure

我试图自动化您在使用shell脚本编译nginx之类的东西时所经历的过程。(我不想使用
apt-get

目前我有:

wget http://nginx.org/download/nginx-1.0.0.tar.gz
tar xf nginx-1.0.0.tar.gz

但是接下来我需要找出目录名是从哪里提取的,这样我就可以启动配置脚本了。

目录名应该是
nginx-1.0.0
或者没有
.tar.gz
的tarball名称。在wget和tar之后尝试以下操作:

cd nginx*
./configure
# etc
如果愿意,也可以使用变量

name='nginx-1.0.0' # or $1, or whatever works for you
wget "http://nginx.org/download/$name.tar.gz"
tar -xf "$name.tar.gz"
./$name/configure

不过,老实说,最好的解决方案是在解压后将cd放入正确的目录中,无论您是使用glob还是使用变量作为目录名。

使用此选项查找归档文件的顶级目录

tar tzf nginx-1.0.0.tar.gz | sed -e 's@/.*@@' | uniq
sed
在这里被调用,以获取由
tar
打印的路径的第一个组件,因此它会进行转换

path/to/file --> path
它通过执行来实现这一点。我使用
@
符号作为分隔符,而不是更常见的
/
符号,以避免在regexp中转义
/
。因此,此命令意味着:将与
/.*
模式匹配的字符串部分(即斜杠后跟任意数量的任意字符)替换为空字符串。或者,换句话说,删除第一个斜杠之后(包括)的字符串部分


(必须对其进行修改,才能使用绝对文件名;但是,在tar文件中,绝对文件名非常罕见。但请确保这种理论上的可能性不会在代码中造成漏洞!)

如另一个答案中所述,使用sed是一种很好的方法,但sed前最好使用
head-1
,而不是sed后使用
uniq
;这具有更好的性能-您只需通过sed泵送第一行,这也避免了uniq将sed的整个输出加载到内存中的要求。此外,如果tar包含多个顶级目录,这将返回第一个顶级目录,而
uniq
将为您提供所有顶级目录

tar tzf nginx-1.0.0.tar.gz | head -1 | sed -e 's/\/.*//'

我个人认为将sed的内部/模式匹配作为
\/
而不是引入另一个定界符(如@)更具可读性,但这只是一个偏好问题,这里给出的答案对于绝对路径并不适用,因为它们将它们修剪到路径的第一个目录。如果已创建具有绝对路径的tar存档,则以下代码段将返回其原始根目录:

tar tf archive.tar | head -1

对于压缩的.tar.gz归档文件,添加选项c。希望这能对其他人有所帮助。

这个如何获取所有顶级目录(包括。):

要获得第一个顶级目录,我将使用@thomas steinbach发布的解决方案:

tar tf nginx-1.0.0.tar.gz | head -1

上面的许多答案都是正确的,但我遇到了一种情况,即实际焦油由于向头部输送管道而停止

Borner shell中的以下命令:

tar -v -zxf plotutils-3.1.tar.gz | head -1 | cut -d "/" -f 1
将生成顶级目录名:plotutils-3.1 但是,生成的目录将为空或包含一项。 我正在使用ubuntu。要获得tar的实际结果,您必须执行另一个命令

tar -zxf plotutils-3.1.tar.gz  

再说一遍。我不确定我在这里做错了什么;但这一点值得注意。我在尝试编写shell脚本以自动运行autotool的配置脚本时发现了这一点。希望这能对其他人有所帮助。

我真的不想把它当作im脚本,而是坚持使用变量。我刚刚将我的tarball重命名为
nginx-1.0.2m.tar.gz
,然后将其解压缩,我得到了
nginx-1.0.0
@Mint。之所以采用这种方式,是因为惯例(tarball通常有一个与tarball同名的顶级目录)。我将添加一个使用变量的解决方案,但效果很差。真的没有理由不放cd。谢谢,这正是我想要的。您没有时间解释sed正则表达式是如何工作的,是吗?有了tzf,我得到的错误不是gzip格式的,用tf works替换tzf请参见unix.stackexchange.com上的问题
tar -zxf plotutils-3.1.tar.gz